SQL-запрос для расчета суммы и добавления суммы из предыдущих строк - PullRequest
2 голосов
/ 29 апреля 2019

Это мой столик T1

  dat_dt      credit     debit
 --------     ------     -----
22-02-2019      10         5
25-02-2019      30         60
10-03-2019      50         40
13-03-2019      100        10

Я хочу сгенерировать следующий вывод

max_date    cr_sum    progressive credit  dr_sum progressive debit 
--------    ------    ------------------  ------  -----------------
25-02-2019    40            40              65           65
13-03-2019    150           190             50           115

Я хочу рассчитать сумму кредита и дебета в каждом месяце, прогрессивный кредит - это столбец, представляющий собой сумму кредита в этом месяце, добавленную к прогрессивному кредиту предыдущего месяца. то же самое для прогрессивного дебета. max_date - максимальная дата в каждом месяце. Есть ли простой способ получить этот вывод, кроме использования циклов?

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Похоже, вы хотите накопительную сумму, но агрегированную по месяцам:

select max(dat_dt) as dat_dt,
       sum(credit) as credit,
       sum(sum(credit)) over (order by min(dat_dt)) as running_credit,
       sum(debit) as debit,
       sum(sum(debit)) over (order by min(dat_dt)) as running_debit
from t1
group by to_char(dat_dt, 'YYYY-MM')
order by min(dat_dt);

Здесь - это скрипта db <>.

1 голос
/ 30 апреля 2019

Вы можете использовать следующий запрос

with t1(  dat_dt, credit, debit) as
(
 select date'2019-02-22',10,  5 from dual union all
 select date'2019-02-25',30, 60 from dual union all
 select date'2019-03-10',50, 40 from dual union all
 select date'2019-03-13',100,10 from dual    
)
select max(dat_dt) as "max date",
       sum(credit) as "cr sum",
       sum(sum(credit)) over ( order by to_char(dat_dt,'yyyymm') ) as "progressive credit", 
       sum(debit) as "dr sum",
       sum(sum(debit))  over ( order by to_char(dat_dt,'yyyymm') ) as "progressive debit"
  from t1
 group by to_char(dat_dt,'yyyymm')
 order by to_char(dat_dt,'yyyymm');

с агрегацией по комбинации год-месяц.

Демо

1 голос
/ 29 апреля 2019

Вы можете попробовать ниже -

select max(dat_date) as max_date,sum(credit) as cr_sum,
       sum(credit) over(order by EXTRACT(month FROM dat_date),EXTRACT(year FROM dat_date)) as progressive_credit,
       sum(debit) as dr_sum,
       sum(debit) over(order by EXTRACT(month FROM dat_date),EXTRACT(year FROM dat_date)) as progressive_debit
group by EXTRACT(month FROM dat_date),EXTRACT(year FROM dat_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...