2012-05-01 41 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