Функция Stuff в T-SQL для объединения значений, повторяющихся n раз - PullRequest
0 голосов
/ 28 февраля 2019
select    
    TM.Tranaction_Slno,TT.Location,
    [Container Number] = stuff((select ',' + TD.Container_Number 
                                from Transaction_Data 
                                for xml path('')), 1, 1, '')   
from 
    Transaction_Master TM         
inner join 
    Transaction_Data TD on TD.Tranaction_Slno = TM.Tranaction_Slno        
left join 
    Transaction_Track TT on TT.Transaction_Slno = TM.Tranaction_Slno 
where 
    TM.Tranaction_Slno = 1770575 

Я получаю вывод с объединенными значениями, повторяющимися n раз.вывод прилагается ниже:

enter image description here

Этот снимок экрана показывает без использования функции вещи:

enter image description here

Я хочу вывод, подобный этому:

Transaction_Slno    Location    Container_Number
----------------------------------------------------------
1770575             CUSTOM       ZIMU1374787,TRHU3437713
1770575             ZERO         ZIMU1374787,TRHU3437713
1770575             CFS          ZIMU1374787,TRHU3437713

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете попробовать использовать логику групповой конкатенации следующим образом:

SELECT
    tm.Transaction_Slno,
    tt.Location,
    [Container Number] = STUFF((
        SELECT ',' + td.Container_Number
        FROM Transaction_Data td
        WHERE td.Transaction_Slno = tm.Transaction_Slno
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM Transaction_Master tm
INNER JOIN Transaction_Track tt
    ON tt.Transaction_Slno = tm.Transaction_Slno
ORDER BY
    tm.Transaction_Slno;

Основная логическая проблема с вашим текущим вызовом STUFF заключается в том, что он не коррелирует запрос с таблицей Transaction_Data кдругие таблицы, участвующие в запросе.

0 голосов
/ 28 февраля 2019

Можете ли вы попробовать код с отчетливым кодом, а также вам нужно добавить условие where в XML-код пути

select  
        TM.Tranaction_Slno,TT.Location,
        [Container Number] = stuff((select distinct  ',' + Container_Number 
                                    from Transaction_Data TD1 
                                    where TD1.Transaction_Slno=TD.Transaction_Slno
                                    and  TD1.Location=TD.Location
                                    for xml path('')), 1, 1, '')   
    from 
        Transaction_Master TM         
    inner join 
        Transaction_Data TD on TD.Tranaction_Slno = TM.Tranaction_Slno  and  TM.Location=TD.Location      
    left join 
        Transaction_Track TT on TT.Transaction_Slno = TM.Tranaction_Slno and  TM.Location=TT.Location
    where 
        TM.Tranaction_Slno = 1770575 
...