如何在SQL查询中选择所有日期

时间:2016-05-06 15:41:36

标签: sql postgresql date

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 个答案:

答案 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
)

根据您的输入生成临时表,然后执行左连接。