[英]Oracle: How query get subtotal and total grand together?
我使用的是oracle,我想查詢小計和總計總計嗎?
示例數據。
SDate | BankCode | ERCODE | CURRENCY | Rate
21/08/2015 | 12 | AQER | USD | 10
21/08/2015 | 12 | AQER | USD | 12
21/08/2015 | 12 | BERT | EUR | 14
21/08/2015 | 12 | POE | JPY | 31
21/08/2015 | 9 | AQER | USD | 15
21/08/2015 | 9 | HUIO | USD | 08
01/09/2015 | 9 | AQER | USD | 45
01/09/2015 | 9 | AQER | USD | 11
01/09/2015 | 9 | JIOW | EUR | 47
我需要結果。
SDate | BankCode | ERCODE | CURRENCY | Rate | No.
21/08/2015 | 12 | AQER | USD | 10 | 1
21/08/2015 | 12 | AQER | USD | 12 |
Sub Total | | | | 22 |
21/08/2015 | 12 | BERT | EUR | 14 | 2
21/08/2015 | 12 | POE | JPY | 31 | 3
GrandTotal | | | | 67 |
21/08/2015 | 9 | AQER | USD | 15 | 1
21/08/2015 | 9 | HUIO | USD | 08 | 2
GrandTotal | | | | 23 |
01/09/2015 | 9 | AQER | USD | 45 | 1
01/09/2015 | 9 | AQER | USD | 11 |
Sub Total | | | | 56 |
01/09/2015 | 9 | JIOW | EUR | 47 | 2
GrandTotal | | | | 103 |
數據關系: SDATE> BANKCODE>貨幣> ERCODE
並在新查詢后插入編號列。
查詢如何一起匯總小計和總計?
謝謝前進。 :)
這個具有dense_rank()
, rollup
和grouping_id
解決方案應該有助於:
with data as (
select sdate, bankcode, ercode, currency, rate,
dense_rank() over (partition by sdate, bankcode order by ercode) rnk
from t)
select sdate, bankcode, ercode, currency, rate, rnk,
case when gid = 0 then 'Sub total' when gid = 1 then 'Grand total' end type
from (
select sdate, bankcode, ercode, currency, rate, rnk, null gid from data
union all
select sdate, bankcode, null, currency, sum(rate), null rnk,
grouping_id(sdate, bankcode, currency) rnk
from data
group by rollup(sdate, bankcode, currency)
having (grouping_id(sdate, bankcode, currency) = 0 and currency = 'USD')
or grouping_id(sdate, bankcode, currency) = 1 )
order by sdate, bankcode desc, decode(currency, 'USD', 1, 2), rnk
測試數據和輸出:
create table t (SDate date, BankCode number(3), Ercode varchar2(5),
Currency varchar2(5), Rate number(6));
insert into t values (date '2015-08-21', 12, 'AQER', 'USD', 10 );
insert into t values (date '2015-08-21', 12, 'AQER', 'USD', 12 );
insert into t values (date '2015-08-21', 12, 'BERT', 'EUR', 14 );
insert into t values (date '2015-08-21', 12, 'POE', 'JPY', 31 );
insert into t values (date '2015-08-21', 9, 'AQER', 'USD', 15 );
insert into t values (date '2015-08-21', 9, 'HUIO', 'USD', 08 );
insert into t values (date '2015-09-01', 9, 'AQER', 'USD', 45 );
insert into t values (date '2015-09-01', 9, 'AQER', 'USD', 11 );
insert into t values (date '2015-09-01', 9, 'JIOW', 'EUR', 47 );
SDATE BANKCODE ERCODE CURRENCY RATE RNK TYPE
----------- -------- ------ -------- ---------- ---------- -----------
2015-08-21 12 AQER USD 10 1
2015-08-21 12 AQER USD 12 1
2015-08-21 12 USD 22 Sub total
2015-08-21 12 BERT EUR 14 2
2015-08-21 12 POE JPY 31 3
2015-08-21 12 67 Grand total
2015-08-21 9 AQER USD 15 1
2015-08-21 9 HUIO USD 8 2
2015-08-21 9 USD 23 Sub total
2015-08-21 9 23 Grand total
2015-09-01 9 AQER USD 45 1
2015-09-01 9 AQER USD 11 1
2015-09-01 9 USD 56 Sub total
2015-09-01 9 JIOW EUR 47 2
2015-09-01 9 103 Grand total
我的第一個念頭是
sum(rate) over (partition by bankcode, currency)
但是有一個EUR / JPY組。您需要更具體地說明您要完成的工作。 在我看來,可以進行小計和大計,但是在pl / sql fe中,如果要獲得2行,計算子項,獲得下2行,計算大數等。最重要的是-什么是sub和grand?
匯總必須幫助您
嘗試這個:
SELECT SDATE, BANKCODE, CURRENCY, ERCODE,
SUM(Rate) AS Rate
FROM your_table
GROUP BY ROLLUP (SDATE, BANKCODE, CURRENCY, ERCODE)
ORDER BY SDATE, BANKCODE, CURRENCY, ERCODE;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.