SQL Server查询一次查询中订单的所有行

时间:2018-06-27 12:39:56

标签: sql sql-server

我的模式:

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)

1 个答案:

答案 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