SELECT oi.created_at, count(oi.id_order_item)
FROM order_item oi

Результат следующий:

2016-05-05 1562
2016-05-06 3865
2016-05-09 1
...etc

Проблема в том, что мне нужна информация за все дни, даже если на эту дату не было id_order_item.

Ожидаемый результат:

Date Quantity
2016-05-05 1562
2016-05-06 3865
2016-05-07 0
2016-05-08 0
2016-05-09 1
0
Svetoslav Dimitrov 6 Май 2016 в 18:41

3 ответа

Лучший ответ

Нельзя сосчитать то, чего нет в базе. Итак, вам нужно сгенерировать недостающие даты, чтобы иметь возможность их «посчитать».

SELECT d.dt, count(oi.id_order_item)
FROM (
   select dt::date
   from generate_series( 
           (select min(created_at) from order_item), 
           (select max(created_at) from order_item), interval '1' day) as x (dt)
) d 
  left join order_item oi on oi.created_at = d.dt
group by d.dt  
order by d.dt;

Запрос получает минимальную и максимальную дату из существующих позиций заказа.

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

SELECT d.dt, count(oi.id_order_item)
FROM (
   select dt::date
   from generate_series(date '2016-05-01', date '2016-05-31', interval '1' day) as x (dt)
) d 
  left join order_item oi on oi.created_at = d.dt
group by d.dt  
order by d.dt;

SQLFiddle: http://sqlfiddle.com/#!15/49024/5

2
a_horse_with_no_name 6 Май 2016 в 17:28

Друг, функция Postgresql Count игнорирует значения NULL. Он буквально не учитывает нулевые значения в столбце, который вы ищете. По этой причине вам необходимо включить oi.created_at в предложение Group By.

PostgreSql ищет строку за строкой последовательно. Поскольку неотъемлемой частью вашего запроса является Count, а count в основном останавливает запрос для этой строки, ваши даты с нулевым id_order_item игнорируются. Если вы сгруппируете по oi.created_at, этот столбец превзойдет счетчик и вернет вам 0 значений.

SELECT oi.created_at, count(oi.id_order_item)
FROM order_item oi
Group by io.created_at

Из TechontheNet (мой самый надежный источник информации): Поскольку вы указали один столбец в своем операторе SELECT, который не инкапсулирован в функции count, вы должны использовать предложение GROUP BY. Поэтому поле отдела должно быть указано в разделе GROUP BY.

Некоторая информация о счетчике в PostgreSql http://www.postgresqltutorial.com/postgresql-count-function/ http://www.techonthenet.com/postgresql/functions/count.php

0
EoinS 6 Май 2016 в 17:16

Решение № 1 Вам нужна таблица дат, в которой вы сохранили все данные даты. Затем выполните левое соединение в зависимости от периода.

Решение # 2

WITH DateTable AS
(
    SELECT  DATEADD(dd, 1, CONVERT(DATETIME, GETDATE())) AS CreateDateTime, 1 AS Cnter
    UNION ALL
    SELECT  DATEADD(dd, -1, CreateDateTime), DateTable.Cnter + 1
    FROM    DateTable
    WHERE   DateTable.Cnter + 1 <= 5
)

Создайте временную таблицу на основе вашего ввода, а затем выполните левое соединение.

-1
niketshah90 6 Май 2016 в 15:54