2012-05-01 42 views
2

我已阅读manyother这里的帖子已经变得非常熟悉Coalesce功能,但我一直无法弄清楚如何执行此特定任务。连接多个表中的多行

所以,我有一个佣金表和一个分类表。我创建了一个gist here,因此您可以通过一些示例数据查看确切的数据结构。基本上,佣金表具有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?如果是这样,任何帮助获得我正在寻找的结果将不胜感激。

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

安德鲁

回答

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

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

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

很好的答案,用于充分利用XML而不是CLR。 +1 –

+1

是的,我仍然发现CLR被两件事情所阻碍:(a)尖头发的老板认为它是危险的,(b)部署代码非常复杂。不只是最初,但当你需要做出改变时,它可能会变成一个非常乏味的练习...... –

+0

@AaronBertrand我被吹走了,我很快得到了这个难题的答案。我只能通过一个小小的调整(不得不移动where逻辑,参见[这里](https://gist.github.com/2571968))来将它移入一个函数。我将不得不回家多研究一下,看看最新的情况,但再次感谢您的及时回复。 – ajtatum

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 
+0

感谢您的快速回复。虽然这不是我一起去的解决方案,但我感谢您向我展示新的东西。我甚至没有意识到这种可能性。 – ajtatum