Запрос, чтобы получить несколько строк в одну строку - PullRequest
4 голосов
/ 10 июля 2019

У меня есть таблица, в которой есть следующая информация:

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-кодирование, но не получаю желаемого результата.

Ответы [ 3 ]

4 голосов
/ 10 июля 2019
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
2 голосов
/ 10 июля 2019

Если вы используете 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
1 голос
/ 10 июля 2019

Следующий запрос должен делать то, что вы хотите:

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 
...