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.

и вставьте столбец № после нового запроса.

Как запрос объединяет промежуточные итоги и итоговые итоги?

Спасибо заранее. :)


person nettoon493    schedule 20.04.2016    source источник
comment
@Aleksej Я давно пробовал ....   -  person nettoon493    schedule 20.04.2016
comment
Пожалуйста, разместите свой код   -  person Aleksej    schedule 20.04.2016


Ответы (3)


Это решение с 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
person Ponder Stibbons    schedule 20.04.2016

Моя первая мысль была

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

но есть группа EUR / JPY .. Вам нужно уточнить, чего вы хотите достичь. На мой взгляд, этот промежуточный и общий итог можно было бы сделать, но в pl / sql f.e. если вы хотите получить 2 строки, вычислить sub, получить следующие 2 строки, вычислить grand и т. д. И самое главное - что такое sub и grand?

person Michał M    schedule 20.04.2016

Rollup должен вам помочь

Попробуй это:

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;
person Pavel Zimogorov    schedule 20.04.2016