2016-04-20 9 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> ВАЛЮТА> ERCODE

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

Как получить промежуточный итог и общий итог вместе?

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

+0

@Aleksej Я долго пробовал .... – nettoon493

+0

Пожалуйста, внесите свой код – Aleksej

ответ

0

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

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

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

0

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

Это решение с 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 

 Смежные вопросы

  • Нет связанных вопросов^_^