2017-08-10 91 views
0

我的想法是做這樣的事情:通過ID的Oracle SQL - 集團通過一列,並提取其他值列

ID CURRENCY AMOUNT 
1 RUS   14,55 
1 USD   22,22 
1 PLN   444,44 
2 PLN   22 

然後我想組,並得到輸出:

INPUT

ID CUR_1 AMOUNT_1 CUR_2 AMOUNT_2 CUR_3 AMOUNT_3 
1 RUS  14,55  USD  22,22  PLN  444,44 
2 PLN  22 

重要的是要合適的金額與正確的貨幣相結合。對於ID = 1,最大對數是3。它可能會發生變化,從1至3。

我試圖使用LISTAGG但它會產生與所述數據的進一步處理的問題。

+0

搜索'PIVOT' – lad2025

+0

還是做在前端,其中這種東西真正屬於。 – LoztInSpace

回答

3
select * 
    from (select t.*, row_number() over (partition by id order by null) rn 
      from t) 
    pivot (max(currency) cur, sum(amount) amt for rn in (1, 2, 3)) 

測試:

with t(id, currency, amount) as (
    select 1, 'RUS', 14.55 from dual union all 
    select 1, 'USD', 22.22 from dual union all 
    select 1, 'PLN', 444.44 from dual union all 
    select 2, 'PLN', 22 from dual) 
select * 
    from (select t.*, row_number() over (partition by id order by null) rn 
      from t) 
    pivot (max(currency) cur, sum(amount) amt for rn in (1, 2, 3)) 

輸出:

 ID 1_CUR  1_AMT 2_CUR  2_AMT 3_CUR  3_AMT 
---------- ----- ---------- ----- ---------- ----- ---------- 
     1 RUS  14,55 USD  22,22 PLN  444,44 
     2 PLN   22 
+0

好吧,這工作,但如果我給了兩行是相同的貨幣: '1 RUS 14,55 1 RUS 22,22 ...' 然後我想有結果: ' 1 RUS 36,77 ...' 而這種做法不和。它將它提取到單獨的列中。首先通過'id'和'currency'然後 – tweant

+0

所以組數據應用'row_number'和'pivot'或使用'dense_rank'代替'row_number'。 –

+0

謝謝,這與'dense_rank'工作。我改變一行'選擇選項卡。*,DENSE_RANK()以上(分區由ID順序由貨幣)RN from'。 – tweant

0

您可以創建一個虛擬的表使用子查詢的每一行,然後再加入由ID虛擬表成單排。