2017-08-10 18 views
0

我在DB2中使用SQL創建了一個報表,並且我在其中一個存儲多個值的表中有一個字段。現在,我需要引用另一個表來獲取這些多個值的描述,如圖所示。使用DB2中的連接將多值列從一個表映射到另一個表

表A

Item_No| R_code 
--------------- 

X  R01,R03,R04 
Y  R02,R03 
Z  R04 

表B

R_code| Description 
------------------ 

R01  Missing info 
R02  Invalid info 
R03  Invalid Account 
R04  Missing Address 

我如何得到以下的結果,如果我加入表A和表B

最終結果

Item_no| R_code  | Description 
--------------------------- 

X  R01,R03,R04 Missing info,Invalid Account,Missing Address 
Y  R02,R03  Invalid info,Invalid Account 
Z  R04   Missing Address 
+0

這將是非常混亂的 - 這應該真的* *進行歸一化... – Siyual

+0

@Siyual:這就是如何將數據存儲在表A,我需要以某種方式映射值表B.這主要是爲了報告的目的,所以我需要使用現有的數據 – user3802118

+0

我會用一個用戶定義函數來處理這個。 – jmarkmurphy

回答

0
WITH unpivot (lvl, item_no, r_code, tail) AS (
    SELECT 1, item_no, 
     CASE WHEN LOCATE(',',r_code) > 0 
       THEN TRIM(LEFT(r_code, LOCATE(',',r_code)-1)) 
       ELSE TRIM(r_code) 
     END, 
     CASE WHEN LOCATE(',',r_code) > 0 
       THEN SUBSTR(r_code, LOCATE(',',r_code)+1) 
       ELSE '' 
     END 
    FROM tableA 
    UNION ALL 
    SELECT lvl + 1, item_no, 
     CASE WHEN LOCATE(',', tail) > 0 
       THEN TRIM(LEFT(tail, LOCATE(',', tail)-1)) 
       ELSE TRIM(tail) 
     END, 
     CASE WHEN LOCATE(',', tail) > 0 
       THEN SUBSTR(tail, LOCATE(',', tail)+1) 
       ELSE '' 
     END 
    FROM unpivot 
    WHERE lvl < 100 AND tail != ''), 

get_desc AS 
(
    SELECT item_no, up.r_code, tb.description 
    FROM unpivot up 
    INNER JOIN tableB tb 
     ON up.item_no = tb.item_no 
) 

SELECT item_no, 
     LISTAGG(r_code, ', ') WITHIN GROUP(ORDER BY r_code ASC) AS r_code, 
     LISTAGG(description, ', ') WITHIN GROUP(ORDER BY description ASC) AS description 
    FROM get_desc 
+0

感謝您的查詢!你能否詳細說明使用的邏輯? – user3802118

+0

我想提一下,我將需要使用這些數據在另一個查詢中進行報告。那麼如何將數據傳遞到我的報告查詢中?我需要發送具有多個值的數據,如上面的顯示(最終結果) – user3802118

相關問題