从文本列中获取记录并存储在带有逗号分隔符的单独列中

问题描述 投票:0回答:1

这是示例数据:

Create table #test (ID int, remark nvarchar(max))

Insert into #test 
values (1,'ITEM:11119:QTY:24 LABEL:00008402279208913782,ITEM:16400:QTY:90 LABEL:00008402279248620756 LABEL:00008402279248620701')

Insert into #test 
values (2,'ITEM:11118:QTY:24 LABEL:00008402279208913782,ITEM:16401:QTY:90 LABEL:00008402279248620756 LABEL:00008402279248620701')

预期输出:

ID  ITEM            LABEL
--------------------------
1   11119,16400     00008402279208913782,00008402279248620756,00008402279248620701  
2   11118,16401     00008402279208913782,00008402279248620756,00008402279248620701  

预期输出的逻辑。备注文本列包含项目及其标签,我们需要为项目创建 2 列 1,为标签创建 1 列,所有值需要保存在以逗号分隔的列中。可能有 1 个项目或 10 个项目,可能会有所不同。

逻辑尝试:

WITH SplitItems AS 
(
    SELECT 
        ID,
        Item = SUBSTRING(value, CHARINDEX(':', value) + 1, CHARINDEX(':', value, CHARINDEX(':', value) + 1) - CHARINDEX(':', value) - 1),
        Label = RIGHT(value, LEN(value) - CHARINDEX(':', REVERSE(value)))
    FROM #test
    CROSS APPLY STRING_SPLIT(remark, ',')
),
AggregatedItems AS (
    SELECT
        ID,
        Items = STRING_AGG(Item, ',') WITHIN GROUP (ORDER BY Item) --AS Items
    FROM SplitItems
    GROUP BY ID
),
AggregatedLabels AS (
    SELECT
        ID,
        Labels = STRING_AGG(Label, ',') WITHIN GROUP (ORDER BY [Label]) --AS Labels
    FROM SplitItems
    GROUP BY ID
)
SELECT
    A.ID,
    A.Items AS ITEM,
    L.Labels AS LABLE
FROM AggregatedItems A
JOIN AggregatedLabels L ON A.ID = L.ID;

我能够正确计算 Item,但无法获得标签。有人可以帮我解决这个问题吗?

sql sql-server sql-server-2012
1个回答
0
投票

因为我看到你正在使用

string_agg()
我怀疑你正在使用2012。这是一个使用一点JSON的选项

示例

with cte as (
Select A.ID
      ,C.*
      ,Itm = lag(value,1) over (partition by ID order by [key])
 From  #Test A
 Cross Apply ( values ( '["'+replace(replace(replace(remark,',',':'),' ',':'),':','","')+'"]') ) B(NS) 
 Cross Apply OpenJSON(NS) C
)
Select Item  = string_agg( case when Itm='Item'  then value end ,',') WITHIN GROUP (ORDER BY value) 
      ,Label = string_agg( case when Itm='Label' then value end ,',') WITHIN GROUP (ORDER BY value) 
 From  cte 
 Where Itm in ('Item','Label')
 Group By ID

结果

Item            Label
11119,16400     00008402279208913782,00008402279248620701,00008402279248620756
11118,16401     00008402279208913782,00008402279248620701,00008402279248620756
© www.soinside.com 2019 - 2024. All rights reserved.