假设这个表:如何分组连接多个列?
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)您可能想要查看的不同方法。 –