Выберите запрос, чтобы показать пропущенные значения за день как 0 - PullRequest
1 голос
/ 04 февраля 2020

У меня есть одна таблица с идентификаторами продуктов и другая с ежедневными данными для этих продуктов. Когда нет данных, я хочу вернуть 0, а не значение вообще. Я попытался использовать левое соединение, но это не дает требуемый набор результатов, поскольку таблица, к которой я могу присоединиться, имеет только идентификаторы продукта, а не в день.

Полагаю, мне нужно сначала создать таблицу со всеми продуктами на все даты, а затем объединить мои данные. Не уверен, как это построить, хотя.

Пример таблицы продуктов:

id - product
1 - test1
2 - test2
3 - test3

пример ежедневных данных:

product - date - value
test1 - 2020-01-01 - 10
test2 - 2020-01-01 - 8
test3 - 2020-01-01 - 9
test1 - 2020-01-02 - 9
test3 - 2020-01-02 - 10
test2 - 2020-01-03 - 6
test3 - 2020-01-03 - 5

Результат Я ищу:

product - date - value
test1 - 2020-01-01 - 10
test2 - 2020-01-01 - 8
test3 - 2020-01-01 - 9
test1 - 2020-01-02 - 9
test2 - 2020-01-02 - 0
test3 - 2020-01-02 - 10
test1 - 2020-01-03 - 0
test2 - 2020-01-03 - 6
test3 - 2020-01-03 - 5

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Вы можете cross join получить строки, а затем left join ввести нужные данные:

select p.id, c.date, coalesce(d.value, 0) as value
from products p cross join
     (select distinct date from daily) c left join
     daily d
     on d.product = p.id and d.date = c.date;

Если есть даты, которых нет в таблице, вы можете сгенерировать даты используя generate_series():

select p.id, c.date, coalesce(d.value, 0) as value
from products p cross join
     (select generate_series(min(d.date), max(d.date), interval '1 day') as date
      from daily
     ) c left join
     daily d
     on d.product = p.id and d.date = c.date;
1 голос
/ 04 февраля 2020

Юо может использовать подзапрос и перекрестное соединение для поиска недостающей комбинации

select p.product, d.date, ifnull(value,0)
from  (
  select distinct p.produtc, d.date 
  from product 
  cross join date 
) t 
inner join product p on t.product = d.product
inner  join  data d on t.date = d.date  
...