0

我正在开发一个 Oracle SQL 查询,用于查找按两个字段维度分组的数字字段的累积总和。

我使用 Oracle Sales History 模式中的 SALES 表作为参考。

实际查询如下:

Select DISTINCT CHANNEL_ID, PROD_ID, TIME_ID, SUM (AMOUNT_SOLD) OVER (PARTITION BY CHANNEL_ID, PROD_ID ORDER BY TIME_ID) AS "Cumulative Sum" 
From SH.SALES
Order By CHANNEL_ID ASC, PROD_ID ASC, TIME_ID ASC;

查询结果:

CHANNEL_ID    PROD_ID   TIME_ID      Cumulative Sum
----------    -------   ------       --------------
2             13        10-JAN-98    1205.99
2             13        16-JAN-98    2335.03
2             13        11-FEB-98    4089.16
...

这个查询的结果结果是好的,但它缺少一件事。

它不显示没有销售交易的日期的累计金额。

我需要的是以下结果:

CHANNEL_ID    PROD_ID   TIME_ID      Cumulative Sum
----------    -------   ------       --------------
2             13        10-JAN-98    1205.99
2             13        11-JAN-98    1205.99
2             13        12-JAN-98    1205.99
2             13        13-JAN-98    1205.99
...
...
2             13        16-JAN-98    2335.03
2             13        17-JAN-98    2335.03
2             13        18-JAN-98    2335.03
...
...
2             13        11-FEB-98    4089.16
2             13        12-FEB-98    4089.16
...
...
4

2 回答 2

0

请看看这是否有效:

with data_table1 as (
select 2 channel_id, 13 prod_id, trunc(sysdate,'YY')+rownum+mod(rownum,6)-2 time_id, 1000*rownum amount_sold from dual connect by level <=10
)
select * from data_table1;
CHANNEL_ID PROD_ID TIME_ID AMOUNT_SOLD
2 13 01-JAN-21 1000
2 13 21 年 1 月 3 日 2000
2 13 21 年 1 月 5 日 3000
2 13 21 年 1 月 7 日 4000
2 13 21 年 1 月 9 日 5000
2 13 21 年 1 月 5 日 6000
2 13 21 年 1 月 7 日 7000
2 13 21 年 1 月 9 日 8000
2 13 21 年 1 月 11 日 9000
2 13 21 年 1 月 13 日 10000
with data_table1 as (
select 2 channel_id, 13 prod_id, trunc(sysdate,'YY')+rownum+mod(rownum,6)-2 time_id, 1000*rownum amount_sold from dual connect by level <=10
),
date_table2 as (select trunc(sysdate,'YY')+rownum-1 TIME_ID from dual connect by level <=(select max(time_id)-min(time_id)+1 from data_table1))
Select distinct CHANNEL_ID, PROD_ID, TIME_ID, SUM (nvl(AMOUNT_SOLD,0)) OVER (PARTITION BY CHANNEL_ID, PROD_ID ORDER BY TIME_ID) AS "Cumulative Sum" 
from data_table1 partition by (channel_id,PROD_ID) right join date_table2 using (TIME_ID)
Order By CHANNEL_ID ASC, PROD_ID ASC, TIME_ID ASC;

CHANNEL_ID PROD_ID TIME_ID 累计金额
2 13 01-JAN-21 1000
2 13 21 年 1 月 2 日 1000
2 13 21 年 1 月 3 日 3000
2 13 21 年 1 月 4 日 3000
2 13 21 年 1 月 5 日 12000
2 13 21 年 1 月 6 日 12000
2 13 21 年 1 月 7 日 23000
2 13 21 年 1 月 8 日 23000
2 13 21 年 1 月 9 日 36000
2 13 21 年 1 月 10 日 36000
2 13 21 年 1 月 11 日 45000
2 13 21 年 1 月 12 日 45000
2 13 21 年 1 月 13 日 55000
于 2021-07-14T09:16:01.767 回答
0

你可以试试下面的查询 -

WITH min_max_date 
     AS (SELECT Min(time_id) min_time_id, 
                Max(time_id) max_time_id 
         FROM   sales) -- fetch min and max dates 
, 
     all_dates 
     AS (SELECT To_char(DATE '2004-01-01' - ROWNUM - 1, 'YYYY-MM-DD') AS date_id 
         FROM   dual 
         CONNECT BY ROWNUM < max_time_id - min_time_id) 
-- generated dates between min and max dates 
SELECT t2.channel_id, 
       t2.prod_id, 
       t1.date_id, 
       SUM(Nvl(amount_sold, 0)) 
         over ( 
           PARTITION BY channel_id, prod_id 
           ORDER BY t1.date_id) 
FROM   all_dates t1 
       left outer join sales t2 
                    ON t1.date__id = t2.time_id; 
于 2019-02-19T11:28:23.593 回答