将多行查询结果合并为单行的查询语句

4

我有一张表格,其中包含以下信息:

ITEM  WH  BATCH  DOC NO
CLD1  FN   B1      3
CLD1  FN   B1      3
CLD1  FN   B2      3
CLD1  FN   B2      3
CLD1  FN   B3      3
CLD1  FN   B4      3

这是我用来获取上述值的代码:

select T0.item,t0.wh,t0.batchnum from oibt t0 where t0.DOCNO = '3' and t0.Wh = 'FN'

我需要类似于这样的输出:
ITEM  WH  BATCH
CLD1  FN   B1,B2,B3,B4

我也使用了STUFF和For XML编码,但是我没有得到期望的输出结果。


分享你的尝试代码。 - Zaynul Abadin Tuhin
FROM OIBT US WHERE US.DOCNUM = '3' AND US.Wh = 'FN' FOR XML PATH('')), 1, 1, '') [BATCH REF NO] from OIBT T0 WHERE T0.DOCNO = '3' AND T0.WH = 'FN' GROUP BY T0.ITEM,T0.WH,t0.Batch ORDER BY T0.Item``` - DeePak
请在问题中附加您的代码 @APDP - MJoy
3个回答

4
SELECT ITEM, 
       WH, 
       BATCH = STUFF((SELECT ',' + BATCH
                      FROM oibt
                      WHERE [DOC NO] = '3'
                      GROUP BY BATCH
                      FOR XML PATH ('')), 1, 1, '') 
FROM oibt
GROUP BY ITEM, WH

这个解决方案非常惊人和强大。我花了几天时间尝试解决这个逻辑问题,多次放弃,其中你有两组并且需要通过优先级选择其中一组。非常感谢,更加优雅! - jwize

2
以下查询应该能满足您的需求:

最初的回答:

SELECT ITEM
    ,WH
    ,BATCH = STUFF( (SELECT DISTINCT ', ' + BATCH FROM table1 t WHERE t.ITEM = ITEM FOR XML PATH ('')),1,1,'')
FROM table1
GROUP BY ITEM, WH

根据您提供的代码示例更新后的回答如下:

最初的回答

SELECT T0.Item
    ,T0.Wh
    ,[BATCH REF NO]  = STUFF((SELECT DISTINCT '; ' + US.Batch FROM OIBT US WHERE US.DOCNO = '3' AND US.Wh = Wh AND US.ITEM = ITEM FOR XML PATH('')), 1, 1, '')
FROM OIBT T0 
WHERE T0.DOCNO = '3' AND T0.WH = 'FN' 
GROUP BY T0.ITEM,T0.WH ORDER BY T0.Item 

1
如果您使用的是SQL Server 2016或更高版本,则可以利用STRING_AGG内置函数,而无需执行繁琐的传统组合XML FOR和STUFF操作:
SELECT  ITEM
        ,WH
        ,BATCH = STRING_AGG(BATCH,',')
FROM
(
    SELECT  DISTINCT 
            ITEM, WH, BATCH
    FROM    OIBT O
    WHERE   DOCNO = '3' 
    AND     Wh = 'FN'
) IQ
GROUP   BY ITEM, WH

我阅读的大多数资料都说需要使用SQL Server 2017或更高版本? - Zach Smith
我可以确认该函数在我的 SQL Server 2016 版本中存在。 - Zach Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接