Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Tambahkan data yang hilang dari bulan atau tahun sebelumnya secara kumulatif

Variasi pendekatan @boneists, dimulai dengan data sampel Anda dalam 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;

Yang mendapatkan hasil yang sama juga, meskipun juga tidak sesuai dengan hasil yang diharapkan dalam pertanyaan:

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 (jangan ragu untuk menggunakan nama yang lebih bermakna!) menghasilkan semua tahun yang berbeda dari data asli Anda, dan juga menambahkan peringkat, jadi 2007 adalah 1, 2008 adalah 2, 2009 adalah 3, dan 2016 adalah 4.

r CTE rekursif menggabungkan data aktual Anda dengan baris dummy dengan penjualan nol, berdasarkan data nama/bulan dari tahun-tahun sebelumnya.

Dari apa yang dihasilkan CTE rekursif, Anda dapat melakukan jumlah kumulatif analitik untuk menambahkan saldo pembukaan/penutupan. Ini menggunakan klausa windowing untuk memutuskan nilai penjualan mana yang akan disertakan - pada dasarnya saldo pembukaan dan penutupan adalah jumlah dari semua nilai hingga saat ini, tetapi pembukaan tidak menyertakan baris saat ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle menyisipkan dari pilih ke dalam tabel dengan lebih banyak kolom

  2. Bagaimana Cara Membuat File Log di Oracle Menggunakan PL/SQL?

  3. Alur masuk di R12.2 dan pemecahan masalah dasar

  4. Oracle SQL Developer 21.4.2 dan SQLcl 21.4.1 sekarang tersedia

  5. Mengimpor File di Oracle Apex Menggunakan wwv_flow_files