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
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
Друг, функция 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
Решение № 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
)
Создайте временную таблицу на основе вашего ввода, а затем выполните левое соединение.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.