簡體   English   中英

SQL:將行與列中的逗號分隔值合並

[英]SQL: Merging rows with comma separated values in columns

我們有一個這樣的表:

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

這是它的工作原理: http ://rextester.com/BYK57259

+-------+----------------+
| GROUP |      team      |
+-------+----------------+
| Grp1  | T1,T2,T3,T4,T4 |
| Grp2  | T1,T2,T3,T4    |
+-------+----------------+

以下是這樣做的方法,首先將逗號分隔的團隊名稱轉換為基於組的單獨行,然后采用唯一的團隊 grp 和團隊名稱。 現在對唯一的團隊名稱應用 listagg 函數來獲得結果。

    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;

這是我得到的輸出

+----+-------------------------------------------+
|GRP ||Teams                                     
+----+-------------------------------------------+
|Grp1|T1,T2,T3,T4                                |
|Grp2|T2,T4,T5                                   |
+----+-------------------------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM