我的模式:
Order: OrderNumber, Line, Status
1, 001, ready
1, 002, ready
1, 003, ready
2, 001, ready
2, 002, packing
我不知道如何执行此查询。我想查询所有准备就绪的订单,并以逗号分隔列表的形式获取该订单的所有行。
我一直在做的是
SELECT OrderNumber FROM Order WHERE Status = 'ready'
然后在该结果集上进行for循环,获取所有行,然后合并(使用另一种编程语言(C#)。
是否可以在一个查询中执行此操作? 例如,要获得(1,001 002 003),(2,001)
答案 0 :(得分:1)
使用带有FOR XML
选项的相关查询。 STUFF
删除了用于连接行号的前导空格。
SELECT
R.OrderNumber,
ReadyLines = STUFF(
(
SELECT
' ' + CONVERT(VARCHAR(20), O.Line)
FROM
[Order] AS O
WHERE
O.OrderNumber = R.OrderNumber AND
O.Status = 'Ready'
ORDER BY
O.Line
FOR XML
PATH ('')
),
1,1, '')
FROM
[Order] AS R
WHERE
R.Status = 'Ready'
GROUP BY
R.OrderNumber
如果在SQL Server 2017上,可以使用STRING_AGG聚合函数:
SELECT
R.OrderNumber,
ReadyLines = STRING_AGG(CONVERT(VARCHAR(20), R.Line), ' ') WITHIN GROUP (ORDER BY R.Line ASC)
FROM
[Order] AS R
WHERE
R.Status = 'Ready'
GROUP BY
R.OrderNumber