SQL:合并列中具有逗号分隔值的行
我们有这样一张桌子:SQL:合并列中具有逗号分隔值的行,sql,oracle,merge,split,comma,Sql,Oracle,Merge,Split,Comma,我们有这样一张桌子: Group | User | Team ------------------- Grp1 | U1 | T1,T2 Grp1 | U2 | T1,T2,T3 Grp1 | U3 | T4 Grp2 | U4 | T2,T4 Grp2 | U5 | T5 Group | Teams ------------- Grp1 | T1,T2,T3,T4 Grp2 | T2,T4,T5 我想创建一个包含如下数据的视图: Group | User
Group | User | Team
-------------------
Grp1 | U1 | T1,T2
Grp1 | U2 | T1,T2,T3
Grp1 | U3 | T4
Grp2 | U4 | T2,T4
Grp2 | U5 | T5
Group | Teams
-------------
Grp1 | T1,T2,T3,T4
Grp2 | T2,T4,T5
我想创建一个包含如下数据的视图:
Group | User | Team
-------------------
Grp1 | U1 | T1,T2
Grp1 | U2 | T1,T2,T3
Grp1 | U3 | T4
Grp2 | U4 | T2,T4
Grp2 | U5 | T5
Group | Teams
-------------
Grp1 | T1,T2,T3,T4
Grp2 | T2,T4,T5
谁能帮帮我吗?我尝试了一些尝试和错误,最后我甚至不知道从现在开始从哪里开始。
我正在使用游标,但您也可以在while循环中使用它。
唯一的问题是,新表中的团队并不明显,但我认为您可以使用字符串命令,它将对问题进行排序
CREATE TABLE #tbl1 ([GROUP] varchar(20), [USER] VARCHAR(20), team VARCHAR(20))
INSERT INTO #tbl1 ( [GROUP], [USER],team )
VALUES ( 'Grp1', 'U1', 'T1,T2'), ( 'Grp1', 'U2', 'T3,T4'), ( 'Grp1', 'U3', 'T4'),
( 'Grp2', 'U1', 'T1,T2'), ( 'Grp2', 'U2', 'T3,T4')
CREATE TABLE #tbl2 ([GROUP] varchar(20), team VARCHAR(20))
DECLARE @ListOfteams VARCHAR(max)
DECLARE @grp VARCHAR(20)
DECLARE Curs CURSOR FAST_FORWARD
FOR
SELECT DISTINCT [GROUP]
FROM #tbl1 AS T
OPEN Curs
FETCH NEXT FROM Curs INTO @grp
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ListOfteams= ''
SELECT @ListOfteams= @ListOfteams+ [Team] + ',' FROM #tbl1 AS CL WHERE CL.[GROUP] = @grp ORDER BY [CL].[USER]
INSERT INTO #tbl2 ( [GROUP],team )
SELECT DISTINCT @grp,
SUBSTRING(@ListOfteams, 1, LEN(@ListOfteams)-1)
FROM #tbl1 AS T
WHERE T.[GROUP] = @grp;
FETCH NEXT FROM Curs INTO @grp
END
CLOSE Curs
DEALLOCATE Curs;
SELECT *
FROM #tbl2 AS T
以下是它的工作原理:
下面是我如何做到这一点,首先将逗号分隔的团队名称根据其组转换为单独的行,然后采用唯一的团队名称和团队名称。现在对唯一的团队名称应用listag函数以获得结果
with t as
(
select 'Grp1' grp,'U1' user1,'T1,T2' team from dual
union all
select 'Grp1','U2','T1,T2,T3' from dual
union all
select 'Grp1','U3','T4' from dual
union all
select 'Grp2','U4','T2,T4' from dual
union all
select 'Grp2','U5','T5' from dual
),
g as
(
select distinct grp, regexp_substr(team,'[^,]+',1,level) team1
from t
connect by level <= LENGTH(REGEXP_REPLACE(team, '[^,]+')) + 1
--group by grp
)
select grp,listagg(team1,',') within group (order by team1) from g
group by grp;
真棒的家伙。。。你真是救命恩人!!谢谢,太棒了,伙计们。。。你真是救命恩人!!非常感谢@没问题,伙计!如果您能通过单击向上箭头按钮对我们的回复进行投票,那将非常好:)