2016-04-20 26 views
0

我使用oracle,我想查詢獲得小計和總盛大在一起?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> CURRENCY> ERCODE

和之後新的查詢插入號列。

查詢如何獲得小計和總共一起?

感謝提前。 :)

+0

@Aleksej我長期試過.... – nettoon493

+0

請發表您的代碼 – Aleksej

回答

0

我首先想到的是

sum(rate) over (partition by bankcode, currency)

,但有一羣EUR/JPY ..你需要更具體的你想要完成的任務。在我看來,這個小計和grandtotal可以完成,但在pl/sql f.e.如果你想得到2行,計算子,獲得下2行,計算宏等。最重要的是 - 什麼是亞和盛大?

0

彙總已經幫你

試試這個:

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; 
1

這與dense_rank()rollupgrouping_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