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 :(得分:2)
您无法计算数据库中没有的内容。所以你需要生成缺少的日期才能“计算”它们。
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
答案 1 :(得分:0)
朋友,Postgresql Count函数忽略Null值。它实际上不考虑您正在搜索的列中的空值。因此,您需要在Group By子句中包含oi.created_at
PostgreSql按顺序逐行搜索。由于查询的一个组成部分是Count,而count基本上会停止该行的查询,因此将忽略null为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中Count的一些信息 http://www.postgresqltutorial.com/postgresql-count-function/ http://www.techonthenet.com/postgresql/functions/count.php
答案 2 :(得分:-1)
解决方案#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
)
根据您的输入生成临时表,然后执行左连接。