Как добавить порядок по пунктам в материале для XML Путь, отличный от столбцов в операторе выбора на SQL сервере - PullRequest
1 голос
/ 13 июля 2020

Мне нужно выполнить операцию конкатенации строк на SQL сервере для тех строк, которые все имеют одинаковый Master_ID. Кроме того, полученный порядок вывода основан на Seq_No Column.

Поскольку я использую старую версию SQL Server, я не могу использовать функцию STRING_AGG().

Как на данный момент я использую функции Stuff and XML PATH для объединения строк, но я не могу упорядочить полученные данные на основе сценария Seq_No Column.

Table:

DECLARE @T TABLE (Master_ID INT,
Associated_ID INT,
Class_ID INT,
Code VARCHAR(20),SEQ_No INT)


Insert into @T VALUES(1297232,NULL,3619202, '1101'  ,1)
Insert into @T VALUES(1297232,NULL,3619202, '0813'  ,2)
Insert into @T VALUES(1297232,NULL,3619202, '170219'    ,3)
Insert into @T VALUES(1297232,NULL,3619202, '19053299',1)
Insert into @T VALUES(1297232,1297233,3619202,'1101'    ,1)
Insert into @T VALUES(1297232,1297233,3619202,'0813'    ,2)
Insert into @T VALUES(1297232,1297233,3619202,'170219'  ,3)
Insert into @T VALUES(1297232,1297233,3619202,'19053299'    ,1)
Insert into @T VALUES(1297232,1297234,3619202,'1101'    ,1)
Insert into @T VALUES(1297232,1297234,3619202,'0813'    ,2)
Insert into @T VALUES(1297232,1297234,3619202,'170219'  ,3)
Insert into @T VALUES(1297232,1297234,3619202,'19053299'    ,1)
Insert into @T VALUES(1297232,1297235,3619202,'1101'    ,1)
Insert into @T VALUES(1297232,1297235,3619202,'0813'    ,2)
Insert into @T VALUES(1297232,1297235,3619202,'170219'  ,3)
Insert into @T VALUES(1297232,1297235,3619202,'19053299'    ,1)

SELECT * FROM @T

Запрос, который я пробовал с ошибкой:

SELECT STUFF((SELECT DISTINCT' ,'+Code
FROM @T
ORDER by ISNULL(Associated_ID,Master_ID),SEQ_No -- Reason for Error
FOR XML PATH (''),TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 

Вывод для приведенного выше кода:

0813 ,1101 ,170219 ,19053299

Ожидаемый результат:

1101,19053299,0813,170219

1 Ответ

0 голосов
/ 13 июля 2020

Вы можете поменять местами DISTINCT на GROUP BY, так как они совпадают, а затем вы можете упорядочить их с помощью функций агрегирования, таких как SUM или MAX

Пример:

SELECT STUFF((SELECT ' ,'+Code
FROM @T
GROUP BY Code
ORDER by SUM(ISNULL(Associated_ID,Master_ID)),SUM(SEQ_No)
FOR XML PATH (''),TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 

-- OUTPUT: 1101 ,19053299 ,0813 ,170219

Ошибка

Элементы ORDER BY должны появиться в списке выбора, если указано SELECT DISTINCT.

не имеет ничего общего с материалом, а только с тем фактом, что вы пытаетесь отсортировать по отличному. Подробнее

...