Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tự động thêm các bản ghi có giá trị bằng 0 cho các AP tiếp theo để chức năng phân tích hoạt động

Một cách tiếp cận khá đơn giản (và tương tự như những gì liên kết AskTom hiển thị) là trích xuất tất cả các cặp năm / tháng và tất cả các cặp tên / r_group, sau đó kết hợp chéo những cặp đó:

with data as (
  select 1 id, 'A' name, 'fruit' r_group, '2007' year, '04' month, 5 sales from dual union all
  select 2 id, 'Z' name, 'fruit' r_group, '2007' year, '04' month, 99 sales from dual union all
  select 3 id, 'A' name, 'fruit' r_group, '2008' year, '05' month, 10 sales from dual union all
  select 4 id, 'B' name, 'vegetable' r_group, '2008' year, '07' month, 20 sales from dual
)
select a.year, a.month, b.name, b.r_group, nvl(d.sales, 0) as sales
from (select distinct year, month from data) a
cross join (select distinct name, r_group from data) b
left join data d on d.year = a.year and d.month = a.month and d.name = b.name and d.r_group = b.r_group
order by year, month, name, r_group;

YEAR MO N R_GROUP        SALES
---- -- - --------- ----------
2007 04 A fruit              5
2007 04 B vegetable          0
2007 04 Z fruit             99
2008 05 A fruit             10
2008 05 B vegetable          0
2008 05 Z fruit              0
2008 07 A fruit              0
2008 07 B vegetable         20
2008 07 Z fruit              0

Nhưng điều đó tạo ra nhiều hàng hơn bạn muốn với tổng hợp cấp đầu tiên của bạn:

YEAR MO N R_GROUP        SALES    OPENING    CLOSING
---- -- - --------- ---------- ---------- ----------
2007 04 A fruit              5          0          5
2007 04 B vegetable          0          0          0
2007 04 Z fruit             99          0         99
2008 05 A fruit             10          5         15
2008 05 B vegetable          0          0          0
2008 05 Z fruit              0         99         99
2008 07 A fruit              0         15         15
2008 07 B vegetable         20          0         20
2008 07 Z fruit              0         99         99

và khi được tổng hợp với cấp độ thứ hai của bạn (từ truy vấn khác) sẽ tạo ra các hàng bổ sung cho, ví dụ, 2007/04 / rau:

YEAR MO R_GROUP        SALES    OPENING    CLOSING
---- -- --------- ---------- ---------- ----------
2007 04 fruit            104          0        104
2007 04 vegetable          0          0          0
2008 05 fruit             10        104        114
2008 05 vegetable          0          0          0
2008 07 fruit              0        114        114
2008 07 vegetable         20          0         20

mà bạn có thể lọc một phần những cột đó ra trước khi tổng hợp vì tất cả các cột trung gian sẽ bằng 0:

with data as (
  select 1 id, 'A' name, 'fruit' r_group, '2007' year, '04' month, 5 sales from dual union all
  select 2 id, 'Z' name, 'fruit' r_group, '2007' year, '04' month, 99 sales from dual union all
  select 3 id, 'A' name, 'fruit' r_group, '2008' year, '05' month, 10 sales from dual union all
  select 4 id, 'B' name, 'vegetable' r_group, '2008' year, '07' month, 20 sales from dual
)
select year,
       month,
       r_group,
       sum(sales) sales,
       sum(opening) opening,
       sum(closing) closing
from (
  select t.*,
         (sum(sales) over (partition by name, r_group
                           order by year, month
                           rows between unbounded preceding and current row
                          ) -sales ) as opening,
         sum(sales) over (partition by name, r_group
                          order by year, month
                          rows between unbounded preceding and current row
                         ) as closing
  from (
    select a.year, a.month, b.name, b.r_group, nvl(d.sales, 0) as sales
    from (select distinct year, month from data) a
    cross join (select distinct name, r_group from data) b
    left join data d
    on d.year = a.year and d.month = a.month and d.name = b.name and d.r_group = b.r_group
  ) t
)
where sales != 0 or opening != 0 or closing != 0
group by year, month, r_group
order by year, month;

để có được:

YEAR MO R_GROUP        SALES    OPENING    CLOSING
---- -- --------- ---------- ---------- ----------
2007 04 fruit            104          0        104
2008 05 fruit             10        104        114
2008 07 fruit              0        114        114
2008 07 vegetable         20          0         20

Bạn có thể lọc thêm kết quả đó để loại bỏ các hàng trong đó giá trị bán hàng tổng hợp vẫn bằng 0, mặc dù nếu bạn đang làm điều đó thì bộ lọc trước đó tổng hợp không cần thiết nữa; nhưng nó vẫn còn một chút lộn xộn. Và không rõ liệu tập hợp ngoài cùng của bạn có thể được sửa đổi để làm điều đó hay không.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 cách để kiểm tra mức độ tương thích trong Oracle (SQLcl &SQL * Plus)

  2. Làm cách nào để đặt lại tất cả các chuỗi trong Oracle DB của tôi về giá trị 0?

  3. Lưu trữ Mảng có thể tìm kiếm trong trường cơ sở dữ liệu SQL

  4. Hướng dẫn cách sao chép db này sang db khác

  5. SQLRecoverableException:I / O Exception:Đặt lại kết nối