连接多个表中的多个行

时间:2012-05-01 22:38:21

标签: sql-server sql-server-2008 tsql coalesce

我已经在这里查看了many other个帖子,并且对Coalesce功能非常熟悉,但我还是无法弄清楚如何执行此特定任务。

所以,我有一个Commissions表和Categories表。我创建了一个gist here,因此您可以通过一些示例数据查看确切的数据结构。基本上,Commission表有SalesRepID,LocationID,CategoryID,SurgeonID和CommissionPercent列。

Using a Coalesce function,我通过传递SalesRepID,LocationID和SurgeonID得到了类似的东西:

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

但是,我试图让它看起来像:

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

我确实用STUFF尝试了几次,但我从来没有得到我正在寻找的结果。

这让我想问一下,在MsSQL 2008 R2中是否可以实现这一点?如果是的话,我将非常感谢任何获得我正在寻找的结果的帮助。

非常感谢你的时间和时间。能量,

安德鲁

2 个答案:

答案 0 :(得分:3)

谢谢你的要点!获取模式和数据比拔牙要好得多。 :-)如果你把它插入你的要点查询,你应该看到你所追求的结果(好吧,非常接近 - 见下文)。

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, '');

结果与您要求的略有不同,但您可以通过在拉取佣金时应用字符串格式来解决此问题。

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

答案 1 :(得分:0)

我之前遇到过类似的问题 - 我唯一能解决这个问题的方法(不使用游标)就是创建一个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