Oracle
 sql >> база данни >  >> RDS >> Oracle

Добавете липсващи данни от предходния месец или година кумулативно

Вариант на подхода @boneists, като се започне с вашите примерни данни в CTE:

with t as (
  select 1 id, 'A' name, '2007' year, '04' month,  5 sales  from dual union all
  select 2 id, 'A' name, '2007' year, '05' month,  2 sales  from dual union all
  select 3 id, 'B' name, '2008' year, '12' month,  3 sales  from dual union all
  select 4 id, 'B' name, '2009' year, '12' month, 56 sales  from dual union all
  select 5 id, 'C' name, '2009' year, '08' month, 89 sales  from dual union all
  select 13 id,'B' name, '2016' year, '01' month, 10 sales  from dual union all
  select 14 id,'A' name, '2016' year, '02' month,  8 sales  from dual union all
  select 15 id,'D' name, '2016' year, '03' month, 12 sales  from dual union all
  select 16 id,'E' name, '2016' year, '04' month, 34 sales  from dual
),
y (year, rnk) as (
  select year, dense_rank() over (order by year)
  from (select distinct year from t)
),
r (name, year, month, sales, rnk) as (
  select t.name, t.year, t.month, t.sales, y.rnk
  from t
  join y on y.year = t.year
  union all
  select r.name, y.year, r.month, 0, y.rnk
  from y
  join r on r.rnk = y.rnk - 1
  where not exists (
    select 1 from t where t.year = y.year and t.month = r.month and t.name = r.name
  )
)
select name, year, month, sales,
  nvl(sum(sales) over (partition by name order by year, month
    rows between unbounded preceding and 1 preceding), 0) as opening_bal,
  nvl(sum(sales) over (partition by name order by year, month
    rows between unbounded preceding and current row), 0) as closing_bal
from r
order by year, month, name;

Което също получава същия резултат, въпреки че също не съответства на очакваните резултати във въпроса:

NAME YEAR MONTH      SALES OPENING_BAL CLOSING_BAL
---- ---- ----- ---------- ----------- -----------
A    2007 04             5           0           5
A    2007 05             2           5           7
A    2008 04             0           7           7
A    2008 05             0           7           7
B    2008 12             3           0           3
A    2009 04             0           7           7
A    2009 05             0           7           7
C    2009 08            89           0          89
B    2009 12            56           3          59
B    2016 01            10          59          69
A    2016 02             8           7          15
D    2016 03            12           0          12
A    2016 04             0          15          15
E    2016 04            34           0          34
A    2016 05             0          15          15
C    2016 08             0          89          89
B    2016 12             0          69          69

y CTE (чувствайте се свободни да използвате по-смислени имена!) генерира всички отделни години от оригиналните ви данни и също така добавя класиране, така че 2007 г. е 1, 2008 г. е 2, 2009 г. е 3, а 2016 г. е 4.

r рекурсивният CTE комбинира вашите действителни данни с фиктивни редове с нулеви продажби въз основа на данните за името/месеца от предходни години.

От това, което рекурсивният CTE произвежда, можете да направите вашата аналитична кумулативна сума, за да добавите началните/затварящите салда. Това е използването на клаузи за прозорец, за да се реши кои стойности на продажбите да се включат – по същество началните и крайните салда са сумата от всички стойности до този момент, но отварянето не включва текущия ред.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайки PL/SQL, как да вкарам съдържанието на файла в blob?

  2. CSV в SQL Developer...

  3. Разделяне на низ, ограничен от тръбата, в колони?

  4. Използвайте tnsnames.ora в Oracle SQL Developer

  5. Това е в подробностите