从多个表中连接多个行(Concatenate multiple rows from multiple

2019-06-24 02:33发布

我查看了很多 其他的就在这里发贴,已成为非常熟悉的凝聚功能,但我一直无法弄清楚如何做到这一点的具体任务。

所以,我有一个佣金表和分类表。 我创建了一个要点在这里 ,所以你可以看到一些例如数据的精确数据结构。 基本上,委员会表有SalesRepID,LocationID,类别ID,SurgeonID和CommissionPercent列。

使用合并功能 ,我已经能够通过传递SalesRepID,LocationID和SurgeonID得到的东西是这样的:

.05 (Shirts), .05 (Shoes), .05 (Dresses), .10 (Hats), .15 (Pants)

不过,我试图让它看起来像这样:

.05 (Shirts, Shoes, Dresses), .10 (Hats), .15 (Pants)

我曾尝试它STUFF了几次,但我从来没有说我要找的结果。

这使我要问,如果这甚至有可能在2008年MSSQL R2? 如果是,在得到我正在寻找的结果任何帮助将不胜感激。

非常感谢您的宝贵时间和能源,

安德鲁

Answer 1:

谢谢你的要点! 这么多比拔牙获得架构和数据更好。 :-)如果堵塞这个到您的要点查询,你应该看到你后的结果(当然,非常接近 - 见下文)。

DECLARE @SalesRepID INT, @SurgeonID INT, @LocationID INT;
SELECT @SalesRepID = 2, @SurgeonID = 1, @LocationID = 1;

;WITH x AS 
(
  SELECT CommissionPercent, Categories = STUFF((SELECT ', ' 
      + tCat.Category FROM #tCategories AS tCat 
      INNER JOIN #tCommissions AS tCom 
      ON tCat.CategoryID = tCom.CategoryID
      WHERE tCom.CommissionPercent = com.CommissionPercent
      FOR XML PATH, TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
 FROM #tCommissions AS com
 WHERE SalesRepID = @SalesRepID
 AND SurgeonID = @SurgeonID
 AND LocationID = @LocationID
),
y AS
(
  SELECT s = RTRIM(CommissionPercent) + ' (' + Categories + ')' 
  FROM x GROUP BY CommissionPercent, Categories
)
SELECT Result = STUFF((SELECT ', ' + s FROM y 
  FOR XML PATH, TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '');

其结果是略有不同的比你要求的,但你可以修复拉动CommissionPercent时应用字符串格式化。

Result
--------------------------------------------------------
0.05 (Shirts, Shoes, Dresses), 0.10 (Hats), 0.15 (Pants)


Answer 2:

我碰到了类似的问题之前 - 我能解决这个(不使用游标)的唯一途径,是通过创建一个CLR聚合函数。 下面是C#示例(和VB): http://technet.microsoft.com/en-us/library/ms131056(v=SQL.90).aspx

我相信这只是做你所需要的:级联。

结合你的榜样和CLR,达到你想要的东西 - 的SQL会是什么样子:

SELECT
  c.CommissionPercent
  , dbo.MyAgg(cat.Category)
FROM #tCommissions AS c
JOIN #tCategories AS cat ON c.CategoryID = cat.CategoryID
group by c.CommissionPercent


文章来源: Concatenate multiple rows from multiple tables