这是示例数据:
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,但无法获得标签。有人可以帮我解决这个问题吗?
因为我看到你正在使用
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