2015-06-22 23 views
1

使用LISTAGG顯示唯一的值,這些都是表我已經在顯示數據如何通過oracle12c

table1 
----------------------------------------------------- 
col1    col2  id 
1223    ram   254 
1232    rajesh  345 


table 2 
-------------------------------------- 
id    col5  col6  col7  col8 
254    1223-1  8789  abc  67 
254    1223-2  8790  efg  87 
254    1223-3  8791  bcd  67 
254    1223-4  8792  abc  87 
345    1232-1  7897  cdf  89 
345    1232-2  7898  cdf  60 

和查詢使用我們用來聯接表

select 
     t1.col1, 
     listagg(t2.col5,',') within group(order by t2.col6)as col5, 
     listagg(t2.col7,',') within group(order by t2.col6)as col7, 
      listagg(t2.col8,',') within group(order by t2.col6)as col8 
    from 
      table1 t1 
      join table2 t2 on t1.id=t2.id; 
     group by col1 

輸出,同時使用上面的查詢

col1   col5      col7 col8 
---------------------------------------------------------------------- 
1233  1223-1,1223-2,1223-3,1223-4  abc,efg,bcd,abc  67,87,67,87 
1232  1232-1,1232-2     cdf,cdf    89,60 

預期結果:

col1   col5      col7  col8 
-------------------------------------------------------------------- 
1233  1223-1,1223-2,1223-3,1223-4  abc,efg,bcd 67,87 
1232  1232-1,1232-2     cdf   89,60 

我們不應該使用Wm_concat,因爲它是無證的。 Col5,col7和Col8應僅由col6訂購。

+0

你有使用'listagg'?我不相信這可以消除重複。我自己寫一個自定義的用戶定義的聚合函數。你可能可以編寫多個連接來獲取不同的值,然後使用'listagg',但效率不高。當你消除重複的「col5」,「col7」和「col8」值時,執行col6命令也可能令人困惑 - 你想按照min(col6),max col6)'還是別的?消除重複之後,一個「col5」值可能對應許多不同的「col6」值。 –

+0

不,我可以使用任何功能來顯示輸出,但列表或字符串應該按col6的順序排列。 –

+0

正如我所說的,「按col6的順序」在聚合行時沒有意義。假設來自'col7'的兩個'abc'值在'col6'爲1和100的行上。'colf'值爲'efg'的行的col6值爲50.如果'abc'在'efg'之前,因爲1 <50?或者'abc'應該在'efg'之後,因爲50 <100? –

回答

0

這是一個解決方案,它在按col6排序時返回請求的列的第一個不同的事件。它使用一箇中間步驟,首先消除重複,然後做最後的LISTAGG:

with t3 as (
SELECT T1.COL1 
    , T2.COL6 
    , case row_number() over (partition by t1.col1, t2.col5 order by t1.col1) 
      when 1 then t2.col5 -- Output the first occurrance of Col5 
      else null 
     end COL5 
    , case row_number() over (partition by t1.col1, t2.col7 order by t1.col1) 
      when 1 then t2.col7 -- Output the first occurrance of Col7 
      else null 
     end COL7 
    , case row_number() over (partition by t1.col1, t2.col8 order by t1.col1) 
      when 1 then t2.col8 -- Output the first occurrance of Col8 
      else null 
     end COL8 
    FROM TABLE1 T1 
    JOIN TABLE2 T2 
    ON T1.ID = T2.ID 
) 
select t3.col1 
     , listagg(COL5,',') WITHIN GROUP (ORDER BY T3.COL6) COL5 
     , listagg(COL7,',') WITHIN GROUP (ORDER BY T3.COL6) COL7 
     , listagg(COL8,',') WITHIN GROUP (ORDER BY T3.COL6) COL8 
    from t3 
    group by col1; 

結果:

COL1 COL5      COL7  COL8 
------- --------------------------- ----------- ----- 
1223 1223-1,1223-2,1223-3,1223-4 ABC,EFG,BCD 67,87 
1232 1232-1,1232-2    CDF   89,60