【问题标题】:Keep the order of a multi string field using the pivot function?使用数据透视函数保持多字符串字段的顺序?
【发布时间】:2020-01-21 20:45:51
【问题描述】:

我有一个“备注”字段,最多可以有 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

【问题讨论】:

    标签: sql sql-server split pivot


    【解决方案1】:

    我会改为使用条件聚合。但是,问题是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
    

    【讨论】:

    • 如果出现重复 [charindex() of the first 次出现] 例如,排序可能会被扭曲。 '1|2|3|4|1'。我还没有遇到 row_number() over(order by (select null)) 没有按顺序返回 string_split() 的情况(尽管没有记录或毕竟是巧合)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多