Заполните пробелы в дате для всех групп

Я пытаюсь заполнить кучу пробелов в дате для каждой группы.

У меня нет проблем с выполнением этой работы, если у меня только одна группа, но когда их несколько, мои даты не заполняются так, как мне бы хотелось.

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

ДО

ПОСЛЕ

2 ответа

Самый дешевый (использует наименьшее количество ресурсов, поэтому обычно работает быстрее всего) и наиболее приемлемый метод - это иметь таблицу дат и таблицу состояний. Затем вы можете использовать эти таблицы, чтобы создать "шаблон" из всех строк, которые вы хотите вернуть, и затем присоединить свои данные к этому "шаблону".

SELECT
  *
FROM
  dates_table    d
CROSS JOIN
  states_table   s
LEFT JOIN
  data_table     t
    ON  t.date_value = d.date_value
    AND t.state_id   = s.state_id
WHERE
      d.date_value BETWEEN x AND y
  AND s.state_id   IN (1, 2)

Использование календарного стола является одним из вариантов здесь. Вы можете оставить таблицу календаря, содержащую все комбинации даты / состояния, в вашей текущей таблице:

WITH dates AS ( 
    SELECT DATE '2018-08-31' AS date FROM dual
    UNION ALL
    SELECT date - 1 AS date
    FROM dates
    WHERE date > DATE '2018-08-01'
),
states AS (
    SELECT 'FL' AS state FROM dual UNION ALL
    SELECT 'GA' FROM dual
)

SELECT
    t1.date,
    t2.state
    t3.qty
FROM dates t1
CROSS JOIN states t2
LEFT JOIN yourTable t3
    ON t1.date = t3.date and t2.state = t3.state
ORDER BY
    t1.date,
    t2.state;
Другие вопросы по тегам