基于位置和定界符的分割字符串

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

我需要帮助。有关CHARINDEX,PATINDEX,SUBSTRING,LEFT和RIGHT的SQL的问题。

我有一些字符串需要根据位置和定界符进行拆分。将其中一些用作列名,将另一部分用作数据。并根据行ID对其进行分组。然后根据需要对值求和。

样本数据,ID,字符串

1    20:4:10:1:20:3:
2    20:1:
3    10:3:
4    30:4:40:1:50:3:

所需的结果是

id  10  20  30  40  50
1   1   7
2       1
3   3
4           4   1   3

数据:

CREATE TABLE #Split (ID int, SplitString varchar(450))
Insert into #Split (ID, SplitString) values 
(1, '20:4:10:1:20:3:'),
(2, '20:1:'),
(3, '10:3:'),
(4, '30:4:40:1:50:3:')

select * From #Split
DROP TABLE #Split

任何帮助将不胜感激!

数据也可能是这样:

CREATE TABLE #Split (ID int, String1 varchar(10),  String1Quantity int, String2 varchar(10), String2Quantity int, String3 VARCHAR(10), String3Quantity int, String4 varchar(10), String4Quantity int, String5 varchar(10), String5Quantity int)

Insert into #Split (ID, String1, String1Quantity, String2, String2Quantity, String3, String3Quantity, String4, String4Quantity, String5, String5Quantity) values 
(1,'20',4,'10',1,'20',3, null, null, null, null),
(2,'20',1,null,null,null,null, null, null, null, null),
(3,'10',3,null,null,null,null, null, null, null, null),
(4,'30',4,'40',1,'50',3, null, null, null, null)

select * From #Split


DROP TABLE #Split
sql delimiter charindex patindex
1个回答
0
投票

我发现了对后一种数据不太好的解决方案,是否有更好的方法来做到这一点?

CREATE TABLE #Split (ID int, String1 varchar(10),  String1Quantity int, String2 varchar(10), String2Quantity int, String3 VARCHAR(10), String3Quantity int, String4 varchar(10), String4Quantity int, String5 varchar(10), String5Quantity int)

Insert into #Split (ID, String1, String1Quantity, String2, String2Quantity, String3, String3Quantity, String4, String4Quantity, String5, String5Quantity) values 
(1,'20',4,'10',1,'20',3, '20', 10, '20', 3),
(2,'20',1,'10',3,null,null, null, null, null, null),
(3,'10',3,'10',3,null,null, null, null, null, null),
(4,'30',4,'40',1,'50',3, '40', 8, '10', 1)

select 
    ID,
    CASE 
        WHEN String1 = '10' and String2 = '10' and String3 = '10' and String4 = '10' and String5 = '10' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '10' and String2 = '10' and String3 = '10' and String4 = '10' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '10' and String2 = '10' and String3 = '10' and String5 = '10' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '10' and String3 = '10' and String4 = '10' and String5 = '10' THEN SUM(String1Quantity+String3Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '10' and String3 = '10' and String4 = '10' and String5 = '10' THEN SUM(String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '10' and String2 = '10' and String3 = '10' THEN SUM(String1Quantity+String2Quantity+String3Quantity)
        WHEN String1 = '10' and String2 = '10' and String4 = '10' THEN SUM(String1Quantity+String2Quantity+String4Quantity)
        WHEN String1 = '10' and String2 = '10' and String5 = '10' THEN SUM(String1Quantity+String2Quantity+String5Quantity)
        WHEN String1 = '10' and String3 = '10' and String4 = '10' THEN SUM(String1Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '10' and String3 = '10' and String5 = '10' THEN SUM(String1Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '10' and String4 = '10' and String5 = '10' THEN SUM(String1Quantity+String4Quantity+String5Quantity)
        WHEN String2 = '10' and String3 = '10' and String4 = '10' THEN SUM(String2Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '10' and String3 = '10' and String5 = '10' THEN SUM(String2Quantity+String3Quantity+String5Quantity)
        WHEN String2 = '10' and String4 = '10' and String5 = '10' THEN SUM(String2Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '10' and String4 = '10' and String5 = '10' THEN SUM(String3Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '10' and String5 = '10' THEN SUM(String3Quantity+String5Quantity)
        WHEN String3 = '10' and String4 = '10' THEN SUM(String3Quantity+String4Quantity)
        WHEN String2 = '10' and String5 = '10' THEN SUM(String2Quantity+String5Quantity)
        WHEN String2 = '10' and String4 = '10' THEN SUM(String2Quantity+String4Quantity)
        WHEN String2 = '10' and String3 = '10' THEN SUM(String2Quantity+String3Quantity)
        WHEN String1 = '10' and String5 = '10' THEN SUM(String1Quantity+String5Quantity)
        WHEN String1 = '10' and String4 = '10' THEN SUM(String1Quantity+String4Quantity)
        WHEN String1 = '10' and String3 = '10' THEN SUM(String1Quantity+String3Quantity)
        WHEN String1 = '10' and String2 = '10' THEN SUM(String1Quantity+String2Quantity)
        WHEN String5 = '10' THEN SUM(String5Quantity)
        WHEN String4 = '10' THEN SUM(String4Quantity)
        WHEN String3 = '10' THEN SUM(String3Quantity)
        WHEN String2 = '10' THEN SUM(String2Quantity) 
        WHEN String1 = '10' THEN SUM(String1Quantity) 
    END AS '10',

    CASE 
        WHEN String1 = '20' and String2 = '20' and String3 = '20' and String4 = '20' and String5 = '20' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '20' and String2 = '20' and String3 = '20' and String4 = '20' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '20' and String2 = '20' and String3 = '20' and String5 = '20' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '20' and String3 = '20' and String4 = '20' and String5 = '20' THEN SUM(String1Quantity+String3Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '20' and String3 = '20' and String4 = '20' and String5 = '20' THEN SUM(String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '20' and String2 = '20' and String3 = '20' THEN SUM(String1Quantity+String2Quantity+String3Quantity)
        WHEN String1 = '20' and String2 = '20' and String4 = '20' THEN SUM(String1Quantity+String2Quantity+String4Quantity)
        WHEN String1 = '20' and String2 = '20' and String5 = '20' THEN SUM(String1Quantity+String2Quantity+String5Quantity)
        WHEN String1 = '20' and String3 = '20' and String4 = '20' THEN SUM(String1Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '20' and String3 = '20' and String5 = '20' THEN SUM(String1Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '20' and String4 = '20' and String5 = '20' THEN SUM(String1Quantity+String4Quantity+String5Quantity)
        WHEN String2 = '20' and String3 = '20' and String4 = '20' THEN SUM(String2Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '20' and String3 = '20' and String5 = '20' THEN SUM(String2Quantity+String3Quantity+String5Quantity)
        WHEN String2 = '20' and String4 = '20' and String5 = '20' THEN SUM(String2Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '20' and String4 = '20' and String5 = '20' THEN SUM(String3Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '20' and String5 = '20' THEN SUM(String3Quantity+String5Quantity)
        WHEN String3 = '20' and String4 = '20' THEN SUM(String3Quantity+String4Quantity)
        WHEN String2 = '20' and String5 = '20' THEN SUM(String2Quantity+String5Quantity)
        WHEN String2 = '20' and String4 = '20' THEN SUM(String2Quantity+String4Quantity)
        WHEN String2 = '20' and String3 = '20' THEN SUM(String2Quantity+String3Quantity)
        WHEN String1 = '20' and String5 = '20' THEN SUM(String1Quantity+String5Quantity)
        WHEN String1 = '20' and String4 = '20' THEN SUM(String1Quantity+String4Quantity)
        WHEN String1 = '20' and String3 = '20' THEN SUM(String1Quantity+String3Quantity)
        WHEN String1 = '20' and String2 = '20' THEN SUM(String1Quantity+String2Quantity)
        WHEN String5 = '20' THEN SUM(String5Quantity)
        WHEN String4 = '20' THEN SUM(String4Quantity)
        WHEN String3 = '20' THEN SUM(String3Quantity)
        WHEN String2 = '20' THEN SUM(String2Quantity) 
        WHEN String1 = '20' THEN SUM(String1Quantity) 
    END AS '20',

    CASE 
        WHEN String1 = '30' and String2 = '30' and String3 = '30' and String4 = '30' and String5 = '30' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '30' and String2 = '30' and String3 = '30' and String4 = '30' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '30' and String2 = '30' and String3 = '30' and String5 = '30' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '30' and String3 = '30' and String4 = '30' and String5 = '30' THEN SUM(String1Quantity+String3Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '30' and String3 = '30' and String4 = '30' and String5 = '30' THEN SUM(String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '30' and String2 = '30' and String3 = '30' THEN SUM(String1Quantity+String2Quantity+String3Quantity)
        WHEN String1 = '30' and String2 = '30' and String4 = '30' THEN SUM(String1Quantity+String2Quantity+String4Quantity)
        WHEN String1 = '30' and String2 = '30' and String5 = '30' THEN SUM(String1Quantity+String2Quantity+String5Quantity)
        WHEN String1 = '30' and String3 = '30' and String4 = '30' THEN SUM(String1Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '30' and String3 = '30' and String5 = '30' THEN SUM(String1Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '30' and String4 = '30' and String5 = '30' THEN SUM(String1Quantity+String4Quantity+String5Quantity)
        WHEN String2 = '30' and String3 = '30' and String4 = '30' THEN SUM(String2Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '30' and String3 = '30' and String5 = '30' THEN SUM(String2Quantity+String3Quantity+String5Quantity)
        WHEN String2 = '30' and String4 = '30' and String5 = '30' THEN SUM(String2Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '30' and String4 = '30' and String5 = '30' THEN SUM(String3Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '30' and String5 = '30' THEN SUM(String3Quantity+String5Quantity)
        WHEN String3 = '30' and String4 = '30' THEN SUM(String3Quantity+String4Quantity)
        WHEN String2 = '30' and String5 = '30' THEN SUM(String2Quantity+String5Quantity)
        WHEN String2 = '30' and String4 = '30' THEN SUM(String2Quantity+String4Quantity)
        WHEN String2 = '30' and String3 = '30' THEN SUM(String2Quantity+String3Quantity)
        WHEN String1 = '30' and String5 = '30' THEN SUM(String1Quantity+String5Quantity)
        WHEN String1 = '30' and String4 = '30' THEN SUM(String1Quantity+String4Quantity)
        WHEN String1 = '30' and String3 = '30' THEN SUM(String1Quantity+String3Quantity)
        WHEN String1 = '30' and String2 = '30' THEN SUM(String1Quantity+String2Quantity)
        WHEN String5 = '30' THEN SUM(String5Quantity)
        WHEN String4 = '30' THEN SUM(String4Quantity)
        WHEN String3 = '30' THEN SUM(String3Quantity)
        WHEN String2 = '30' THEN SUM(String2Quantity) 
        WHEN String1 = '30' THEN SUM(String1Quantity) 
    END AS '30',

    CASE 
        WHEN String1 = '40' and String2 = '40' and String3 = '40' and String4 = '40' and String5 = '40' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '40' and String2 = '40' and String3 = '40' and String4 = '40' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '40' and String2 = '40' and String3 = '40' and String5 = '40' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '40' and String3 = '40' and String4 = '40' and String5 = '40' THEN SUM(String1Quantity+String3Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '40' and String3 = '40' and String4 = '40' and String5 = '40' THEN SUM(String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '40' and String2 = '40' and String3 = '40' THEN SUM(String1Quantity+String2Quantity+String3Quantity)
        WHEN String1 = '40' and String2 = '40' and String4 = '40' THEN SUM(String1Quantity+String2Quantity+String4Quantity)
        WHEN String1 = '40' and String2 = '40' and String5 = '40' THEN SUM(String1Quantity+String2Quantity+String5Quantity)
        WHEN String1 = '40' and String3 = '40' and String4 = '40' THEN SUM(String1Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '40' and String3 = '40' and String5 = '40' THEN SUM(String1Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '40' and String4 = '40' and String5 = '40' THEN SUM(String1Quantity+String4Quantity+String5Quantity)
        WHEN String2 = '40' and String3 = '40' and String4 = '40' THEN SUM(String2Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '40' and String3 = '40' and String5 = '40' THEN SUM(String2Quantity+String3Quantity+String5Quantity)
        WHEN String2 = '40' and String4 = '40' and String5 = '40' THEN SUM(String2Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '40' and String4 = '40' and String5 = '40' THEN SUM(String3Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '40' and String5 = '40' THEN SUM(String3Quantity+String5Quantity)
        WHEN String3 = '40' and String4 = '40' THEN SUM(String3Quantity+String4Quantity)
        WHEN String2 = '40' and String5 = '40' THEN SUM(String2Quantity+String5Quantity)
        WHEN String2 = '40' and String4 = '40' THEN SUM(String2Quantity+String4Quantity)
        WHEN String2 = '40' and String3 = '40' THEN SUM(String2Quantity+String3Quantity)
        WHEN String1 = '40' and String5 = '40' THEN SUM(String1Quantity+String5Quantity)
        WHEN String1 = '40' and String4 = '40' THEN SUM(String1Quantity+String4Quantity)
        WHEN String1 = '40' and String3 = '40' THEN SUM(String1Quantity+String3Quantity)
        WHEN String1 = '40' and String2 = '40' THEN SUM(String1Quantity+String2Quantity)
        WHEN String5 = '40' THEN SUM(String5Quantity)
        WHEN String4 = '40' THEN SUM(String4Quantity)
        WHEN String3 = '40' THEN SUM(String3Quantity)
        WHEN String2 = '40' THEN SUM(String2Quantity) 
        WHEN String1 = '40' THEN SUM(String1Quantity) 
    END AS '40',

    CASE 
        WHEN String1 = '50' and String2 = '50' and String3 = '50' and String4 = '50' and String5 = '50' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '50' and String2 = '50' and String3 = '50' and String4 = '50' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '50' and String2 = '50' and String3 = '50' and String5 = '50' THEN SUM(String1Quantity+String2Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '50' and String3 = '50' and String4 = '50' and String5 = '50' THEN SUM(String1Quantity+String3Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '50' and String3 = '50' and String4 = '50' and String5 = '50' THEN SUM(String2Quantity+String3Quantity+String4Quantity+String5Quantity)
        WHEN String1 = '50' and String2 = '50' and String3 = '50' THEN SUM(String1Quantity+String2Quantity+String3Quantity)
        WHEN String1 = '50' and String2 = '50' and String4 = '50' THEN SUM(String1Quantity+String2Quantity+String4Quantity)
        WHEN String1 = '50' and String2 = '50' and String5 = '50' THEN SUM(String1Quantity+String2Quantity+String5Quantity)
        WHEN String1 = '50' and String3 = '50' and String4 = '50' THEN SUM(String1Quantity+String3Quantity+String4Quantity)
        WHEN String1 = '50' and String3 = '50' and String5 = '50' THEN SUM(String1Quantity+String3Quantity+String5Quantity)
        WHEN String1 = '50' and String4 = '50' and String5 = '50' THEN SUM(String1Quantity+String4Quantity+String5Quantity)
        WHEN String2 = '50' and String3 = '50' and String4 = '50' THEN SUM(String2Quantity+String3Quantity+String4Quantity)
        WHEN String2 = '50' and String3 = '50' and String5 = '50' THEN SUM(String2Quantity+String3Quantity+String5Quantity)
        WHEN String2 = '50' and String4 = '50' and String5 = '50' THEN SUM(String2Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '50' and String4 = '50' and String5 = '50' THEN SUM(String3Quantity+String4Quantity+String5Quantity)
        WHEN String3 = '50' and String5 = '50' THEN SUM(String3Quantity+String5Quantity)
        WHEN String3 = '50' and String4 = '50' THEN SUM(String3Quantity+String4Quantity)
        WHEN String2 = '50' and String5 = '50' THEN SUM(String2Quantity+String5Quantity)
        WHEN String2 = '50' and String4 = '50' THEN SUM(String2Quantity+String4Quantity)
        WHEN String2 = '50' and String3 = '50' THEN SUM(String2Quantity+String3Quantity)
        WHEN String1 = '50' and String5 = '50' THEN SUM(String1Quantity+String5Quantity)
        WHEN String1 = '50' and String4 = '50' THEN SUM(String1Quantity+String4Quantity)
        WHEN String1 = '50' and String3 = '50' THEN SUM(String1Quantity+String3Quantity)
        WHEN String1 = '50' and String2 = '50' THEN SUM(String1Quantity+String2Quantity)
        WHEN String5 = '50' THEN SUM(String5Quantity)
        WHEN String4 = '50' THEN SUM(String4Quantity)
        WHEN String3 = '50' THEN SUM(String3Quantity)
        WHEN String2 = '50' THEN SUM(String2Quantity) 
        WHEN String1 = '50' THEN SUM(String1Quantity) 
    END AS '50'

From #Split
Group by Id, String1, String2, String3, string4, String5

drop table #Split
© www.soinside.com 2019 - 2024. All rights reserved.