假设有这样一张表:
我希望生成一个关于每个顾客购买和付款方式的报告。
但我希望报告以每个顾客为一行的形式呈现,例如:
到目前为止,我发现可以使用
这个查询可以得到结果,但我担心它的速度。
乍一看,这里有三个不同的查询,其中两个将分别与Purchases的行数相乘。这最终会使速度呈指数级下降。
那么,有没有更高效的方法来做到这一点?
我想要添加更多的列来汇总,我应该为每个列都做一个STUFF()块吗?这听起来对我来说不够快。 有什么建议吗?
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
这个查询可以得到结果,但我担心它的速度。
乍一看,这里有三个不同的查询,其中两个将分别与Purchases的行数相乘。这最终会使速度呈指数级下降。
那么,有没有更高效的方法来做到这一点?
我想要添加更多的列来汇总,我应该为每个列都做一个STUFF()块吗?这听起来对我来说不够快。 有什么建议吗?
for xml path
时要小心,如果你的数据中有例如&
这样的字符,它可能会让你感到惊讶。Aaron Bertrand对不同方法进行了比较,你可能会想要查看一下。 - James Z