2011-11-04 100 views
0

目前,我已經寫了:需要使用SQL將多行連接成單個單元格?

SELECT IT_ID, SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2) GROUPS 
FROM (SELECT U.IT_ID, LAST_NAME, FIRST_NAME, GRP, ROW_NUMBER() OVER (ORDER BY U.IT_ID) rn, COUNT(*) OVER() cnt 
FROM ECG_IT_USERS U 
JOIN SECUREGROUPS G ON U.IT_ID = G.IT_ID) 

START WITH rn = 1 
CONNECT BY rn = PRIOR rn + 1 

這將返回:

IT_ID GROUPS 

afz23 ADMIN 
afz23 ADMIN,QA 
alv77 ADMIN,QA,USER 
jaj23 ADMIN,QA,USER,USER 
klo26 ADMIN,QA,USER,USER,PROD 
klo26 ADMIN,QA,USER,USER,PROD,ADMIN 
klo26 ADMIN,QA,USER,USER,PROD,ADMIN,QA 
mav45 ADMIN,QA,USER,USER,PROD,ADMIN,QA,ADMIN 

我想不通我怎麼可以讓它重新遇到一個新用戶後?它似乎在繼續前面的組,即使用戶不屬於他們。

我需要看到:

IT_ID GROUPS 

afz23 ADMIN,QA 
alv77 USER 
jaj23 USER 
klo26 PROD,ADMIN,QA 
mav45 ADMIN 
+0

可能的重複[是否有一個Oracle SQL查詢將多行聚合成一行?](http://stackoverflow.com/questions/1120706/is-there-an-oracle-sql-query-that-aggregates - 多行成一行) –

+0

我的DB2版本中沒有相關的功能,但如果您將'AND it_id = PRIOR it_id'添加到'CONNECT BY'子句中,會發生什麼情況(是嗎?甚至可能)? –

回答

0

有你需要做三件事情。

首先,您需要向row_number函數添加一個分區,以便每個IT_ID從1開始編號。您還需要將IT_ID列添加到連接方式,以便僅採用具有相同IT_ID值的行。最後,您需要按it_id列進行分組以刪除重複的行。

最後的查詢將

with ECG_IT_USERS as (
    select 'afz23' as it_id from dual union all 
    select 'alv77' as it_id from dual union all 
    select 'jaj23' as it_id from dual union all 
    select 'klo26' as it_id from dual union all 
    select 'mav45' as it_id from dual 
), 
securegroups as (
    select 'afz23' as it_id, 'ADMIN' as grp from dual union all 
    select 'afz23' as it_id, 'QA' as grp from dual union all 
    select 'alv77' as it_id, 'USER' as grp from dual union all 
    select 'jaj23' as it_id, 'USER' as grp from dual union all 
    select 'klo26' as it_id, 'PROD' as grp from dual union all 
    select 'klo26' as it_id, 'ADMIN' as grp from dual union all 
    select 'klo26' as it_id, 'QA' as grp from dual union all 
    select 'mav45' as it_id, 'ADMIN' as grp from dual 
) 
SELECT 
    IT_ID, 
    Max(SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2)) GROUPS 
FROM (
    SELECT 
    U.IT_ID, 
-- LAST_NAME, 
-- BFIRST_NAME, 
    GRP, 
    ROW_NUMBER() OVER (partition by u.it_id ORDER BY U.IT_ID) rn, 
    COUNT(*) OVER() cnt 
FROM ECG_IT_USERS U 
JOIN SECUREGROUPS G ON (U.IT_ID = G.IT_ID)) 
START WITH rn = 1 
CONNECT BY rn = PRIOR rn + 1 and it_id = prior it_id 
Group by it_id 

這就產生了我下面的輸出:

IT_ID GROUPS 
----- -------------------- 
alv77 USER 
afz23 ADMIN,QA 
jaj23 USER 
mav45 ADMIN 
klo26 PROD,ADMIN,QA 

編輯:我添加了一個與條款與一些樣本數據,這會運行我沒有任何問題,儘管我註釋掉了last_name和first_name列,因爲它們對最終查詢沒有影響,我在連接條件中放了一些括號。

也許它會支付開始與我已經得到上面的查詢,檢查它最初適用於您,並適當修改它。

+0

謝謝!我有一個問題,雖然START/CONNECT BY子句不認識,說無效標識符?我猜測是因爲它對外部電話是不可見的?但是很奇怪 – antonpug

+0

@antonpug:我在查詢中添加了一些示例數據,現在看看它是否適用於您。 –

相關問題