Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:合并列中具有逗号分隔值的行_Sql_Oracle_Merge_Split_Comma - Fatal编程技术网

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;

真棒的家伙。。。你真是救命恩人!!谢谢,太棒了,伙计们。。。你真是救命恩人!!非常感谢@没问题,伙计!如果您能通过单击向上箭头按钮对我们的回复进行投票,那将非常好:)