假設這個表:如何分組連接多個列?
PruchaseID | Customer | Product | Method
-----------|----------|----------|--------
1 | John | Computer | Credit
2 | John | Mouse | Cash
3 | Will | Computer | Credit
4 | Will | Mouse | Cash
5 | Will | Speaker | Cash
6 | Todd | Computer | Credit
我想生成對他們買什麼每一位客戶,他們的支付方法的報告。
但我想該報告是每個客戶一行,如:
Customer | Products | Methods
---------|--------------------------|--------------
John | Computer, Mouse | Credit, Cash
Will | Computer, Mouse, Speaker | Credit, Cash
Todd | Computer | Credit
什麼我發現到目前爲止是組接續模式採用XML PATH
方法,如:
SELECT
p.Customer,
STUFF(
SELECT ', ' + xp.Product
FROM Purchases xp
WHERE xp.Customer = p.Customer
FOR XML PATH('')), 1, 1, '') AS Products,
STUFF(
SELECT ', ' + xp.Method
FROM Purchases xp
WHERE xp.Customer = p.Customer
FOR XML PATH('')), 1, 1, '') AS Methods
FROM Purchases
這給了我的結果,但我關心的是這個速度。
乍一看有三種不同的選擇在這裏進行,其中兩個將乘以購買的行數。最終這會慢慢減慢。
那麼,有沒有辦法做到這一點有更好的表現?
我想添加更多的列來聚合,我應該爲每個列做這個STUFF()塊嗎?這聽起來不夠快。
Siggestions?
好吧,你正在反規範化你的數據來做到這一點,因此性能將是一個潛在的挑戰。 XML方法是將數據非規範化爲分隔列表的最佳方法。 –
使用'for xml path'時要小心,如果你有例如'&'的數據,它可能會讓你大吃一驚。 Aaron Bertrand做了一個[比較](http://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation)您可能想要查看的不同方法。 –