【发布时间】:2017-07-27 06:29:31
【问题描述】:
如果您运行以下代码,您将获得如下所示的结果:
ITEM DIFF_QTY DATE_OUTGO WAREH COMPANY
1000 -5, -3, -4, 2017-08-01, 2017-08-02, 2017-08-03, WH CMP
太棒了,这就是我正在寻找的输出。遗憾的是,这仅在选择特定 ITEM 时有效。如果我删除 WHERE 则所有内容都放在同一行输出中。
那么我如何通过分组 (ITEM, WAREH, COMPANY) 来分离结果?所以最终的结果应该是这样的:
ITEM DIFF_QTY DATE_OUTGO WAREH COMPANY
1000 -5, -3, -4, 2017-08-01, 2017-08-02, 2017-08-03, WH CMP
1001 -10, -13 2017-08-01, 2017-08-03 WH CMP
代码
DECLARE @tempTable TABLE (
ITEM nvarchar(32),
DIFF_QTY nvarchar(6),
DATE_OUTGO nvarchar(10),
WAREH nvarchar(5),
COMPANY nvarchar(5)
)
INSERT INTO @tempTable (ITEM, DIFF_QTY, DATE_OUTGO, WAREH, COMPANY)
VALUES
(1000, '-5', '2017-08-01', 'WH', 'CMP'),
(1000, '-3', '2017-08-02', 'WH', 'CMP'),
(1000, '-4', '2017-08-03', 'WH', 'CMP'),
(1001, '-10', '2017-08-01', 'WH', 'CMP'),
(1001, '-13', '2017-08-03', 'WH', 'CMP')
SELECT *
FROM @tempTable
DECLARE @itemNum nvarchar(32)
DECLARE @diffQty nvarchar(max)
DECLARE @dateOutgo nvarchar(max)
DECLARE @warehouse nvarchar(5)
DECLARE @company nvarchar(5)
SET @diffQty = ''
SET @dateOutgo = ''
SELECT
@itemNum = ITEM,
@diffQty = @diffQTY + DIFF_QTY + ', ',
@dateOutgo = @dateOutgo + DATE_OUTGO + ', ',
@warehouse = WAREH,
@company = COMPANY
FROM
@tempTable
WHERE
ITEM = 1000
SELECT @itemNum ITEM_NUM, @diffQty DIFF_QTY, @dateOutgo DATE_OUTGO, @warehouse WAREHOUSE, @company COMPANY
我查看了有关合并的多个线程,但几乎每个解决方案都要求您不要同时执行多项操作(SELECT、GROUP、COALESCE、多列等...)
【问题讨论】:
-
在 SQL Server 中搜索 STRING_AGG。 SQL Server 2017 中的 XML/CLR 函数/STRING_AGG 有很多方法。ListAGG in SQLSERVER 同样使用
@var = @var + ...可能是未定义的。 -
我会查一下(之前看过),2016 版可以用吗?
-
这里有使用SQL Server 2017 String_AGG的解决方案。
-
@lad2025 看起来真的很优雅!
-
@lad2025 遗憾的是我不能使用它。 “STRING_AGG”不是可识别的内置函数名称。
标签: sql-server tsql sql-server-2016