Oracle SQL - добавьте отсутствующие даты в запрос для каждого уникального значения в другом столбце - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь сделать запрос в Oracle SQL из таблицы ниже, и моя цель - добавить пропущенные дни для каждого магазина.

    +------------+-------+-------+
    |    Date    | Store | Sales |
    +------------+-------+-------+
    | 01/01/2018 | A     |    20 |
    | 01/03/2018 | A     |    30 |
    | 01/02/2018 | B     |    10 |
    | 01/03/2018 | B     |    40 |
    | 01/04/2018 | B     |    50 |
    | 01/01/2018 | C     |    20 |
    +------------+-------+-------+

Желаемый вывод:

    +------------+-------+-------+
    |    Date    | Store | Sales |
    +------------+-------+-------+
    | 01/01/2018 | A     |    20 |
    | 01/02/2018 | A     |     0 |
    | 01/03/2018 | A     |    30 |
    | 01/04/2018 | A     |     0 |
    | 01/01/2018 | B     |     0 |
    | 01/02/2018 | B     |    10 |
    | 01/03/2018 | B     |    40 |
    | 01/04/2018 | B     |    50 |
    | 01/01/2018 | C     |    20 |
    | 01/02/2018 | C     |     0 |
    | 01/03/2018 | C     |     0 |
    | 01/04/2018 | C     |     0 |
    +------------+-------+-------+

У меня есть 4 дня, которые мне нужны из этого SO вопроса , однако я не могу сделать вывод похожим на желаемый вывод. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Один из вариантов - присоединиться к таблице календарь :

WITH calendar AS (
    SELECT date '2018-01-01' AS "Date" FROM dual UNION ALL
    SELECT date '2018-02-01' FROM dual UNION ALL
    SELECT date '2018-03-01' FROM dual UNION ALL
    SELECT date '2018-04-01' FROM dual
)     

SELECT
    c."Date",
    s.Store,
    COALESCE(t.Sales, 0) AS Sales
FROM calendar c
CROSS JOIN (SELECT DISTINCT Store FROM yourTable) s
LEFT JOIN yourTable t
    ON t."Date" = c."Date" AND t.Store = s.Store;

Здесь может потребоваться использование формальной календарной таблицы, поскольку, возможно, ваш текущий набор данных таблицы не содержит все даты, которые вы хотите включить в окончательный отчет.

0 голосов
/ 06 ноября 2018

Используйте cross join для генерации строк и затем left join для ввода данных:

select s.store, d.date, coalesce(t.sales, 0) as sales
from (select distinct store from t) s cross join
     (select distinct date from t) d left join
     t
     on t.store = s.store and t.date = t.date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...