Сохранить порядок многострочного поля, используя функцию pivot? - PullRequest
0 голосов
/ 21 января 2020

У меня есть поле «Замечания», которое может содержать до 10 кодов, разделенных символом «труба». Пример результатов поля ниже. У меня почти проблема решена с помощью функции Pivot, как показано ниже. Проблема, которую я не могу понять, состоит в том, как сохранить их в правильном порядке, как в поле примечаний. В примечании ниже 1 | 120 | 482 | 10 он возвращается в строках в порядке 1 10 120 482 вместо 1 120 482 10. Есть идеи?

SELECT 
,Remarks
,[1] AS Remark4
,[2] AS Remark5
,[3] AS Remark6
,[4] AS Remark7
,[5] AS Remark8
,[6] AS Remark9

FROM (SELECT 
            ,Remarks
            ,value
            ,dense_Rank() OVER(PARTITION BY Remarks ORDER BY value) as testnbr
            from incident
             CROSS APPLY STRING_SPLIT(Remarks, '|') AS BK

        ) as srctbl
PIVOT(
    max(VALUE)
    FOR testnbr IN([1],[2],[3],[4],[5],[6])  
) as PVT

Примечания

1|120|170  
1|120|375  
1|120|482|10

1 Ответ

1 голос
/ 22 января 2020

Я бы просто использовал условное агрегирование. Но проблема в том, что string_split() не гарантирует порядок записей. Таким образом, вы можете эмулировать это при условии, что нет повторяющихся замечаний:

select i.remarks, r.*
from incident i cross apply
     (select max(case when seqnum = 1 then value end) as remark_1,
             max(case when seqnum = 2 then value end) as remark_2,
             max(case when seqnum = 3 then value end) as remark_3,
             max(case when seqnum = 4 then value end) as remark_4,
             max(case when seqnum = 5 then value end) as remark_5,
             max(case when seqnum = 6 then value end) as remark_6             
      from (select value,
                   row_number() over (order by charindex('|' + value + '|', '|' + i.Remarks + '|') as seqnum
            from string_split(i.Remarks, '|') s
        ) r
...