Oracle Over Partition By Query с внешним соединением для всех доступных дат - PullRequest
0 голосов
/ 19 февраля 2019

Я разрабатываю запрос Oracle SQL, который находит кумулятивную сумму числового поля, сгруппированного по двум измерениям поля.

Я использую таблицу SALES из схемы Oracle Sales History в качестве ссылки.

Фактический запрос выглядит следующим образом:

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
...
...

1 Ответ

0 голосов
/ 19 февраля 2019

Можете ли вы попробовать следующий запрос -

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; 
...