Одна из студенток просила помочь с задачей , задача интересная, поэтому предлагаю вашему вниманию.
Необходимо вывести все месяцы текущего года, с указанием клиента и суммы его платежей, отдельной колонкой
вывести сумму всех платежей клиента с начала года (нарастающий итог по клиенту с начала года). Если в каком-то
месяце клиент не платил, вывести 0
я так решил
createtable pay1(userid number, dt date, paysum number);insertinto pay1 values(1, sysdate-10, 22);insertinto pay1 values(2, sysdate-20, 2);insertinto pay1 values(2, sysdate-90, 72);insertinto pay1 values(1, sysdate-50, 32);insertinto pay1 values(1, sysdate-50, 90);insertinto pay1 values(2, sysdate-70, 52);insertinto pay1 values(1, sysdate-50, 92);insertinto pay1 values(1, sysdate-10, 32);insertinto pay1 values(1, sysdate-90, 90);insertinto pay1 values(2, sysdate-90, 52);insertinto pay1 values(1, sysdate-150, 92);insertinto pay1 values(1, sysdate-110, 32);
Для нарастающего итога используется аналитическия функция SUM, с под запросом, нулевые значения создаем подзапросом с connect by level интервал дат задаем в конструкции connect by
в данном случае от 2019-05-01 до 2020-01-01
select userid,mn,yy,passum , sum(passum) over (partitionby userid orderby yy,mn) from ( select userid , extract(monthfrom dt) mn, extract(yearfrom dt) yy, sum(pasum) passum from (selectdecode( userid,null, userid1, userid) userid , decode(dt,null,dt1,dt) dt , decode(paysum,null,0,paysum) pasum from pay1
right join
(select dt1,userid1 from
(
(selectdate'2019-05-01'+level-1as dt1 from dual connectbylevel<= date'2020-01-01'-date'2019-05-01') dt
cross join (selectdistinct userid userid1 from pay1) pay
)) payd ontrunc(dt) = trunc(dt1) and userid = userid1
) mzt groupby userid, extract(monthfrom dt), extract(yearfrom dt) orderby yy,mn
) tt1