Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dodaj zbiorczo brakujące dane z poprzedniego miesiąca lub roku

Odmiana podejścia @boneists, zaczynając od przykładowych danych w 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;

Który również uzyskuje ten sam wynik, chociaż nie odpowiada oczekiwanym wynikom w pytaniu:

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 (możesz używać bardziej znaczących nazw!) generuje wszystkie odrębne lata z oryginalnych danych, a także dodaje ranking, więc 2007 to 1, 2008 to 2, 2009 to 3, a 2016 to 4.

r rekursywne CTE łączy Twoje rzeczywiste dane z fikcyjnymi wierszami z zerową sprzedażą, w oparciu o dane nazwy/miesiąca z poprzednich lat.

Z tego, co generuje ten rekurencyjny CTE, możesz wykonać analityczną sumę skumulowaną, aby dodać salda otwarcia/zamknięcia. Wykorzystuje to klauzule okienkowe, aby zdecydować, które wartości sprzedaży uwzględnić - zasadniczo saldo otwarcia i zamknięcia jest sumą wszystkich wartości do tego momentu, ale otwarcie nie obejmuje bieżącego wiersza.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 sposoby na zmianę strefy czasowej w Oracle

  2. SELECT z tabeli z listą Varying IN w klauzuli WHERE

  3. Słowo kluczowe „CONTINUE” w Oracle 10g PL/SQL

  4. Jak utworzyć klucz obcy w Oracle SQL Developer?

  5. Pytanie o opinie :Jedna sekwencja dla wszystkich tabel