2017-04-04 34 views
2

如果我有一个这样的表称为orders重复查询其在日期范围返回多个列的PostgreSQL

id  date   value  client_name 
1  01/02/2017 50   Name 1 
2  02/02/2017 60   Name 2 
3  02/02/2017 60   Name 2 
4  03/02/2017 20   Name 2 

和获取有关订单某一天我的详细信息的查询:

Select 
    sum(value) as total_order_value, 
    count(id) as number_of_orders 
from orders 
where orders.date = '02/03/2017'::date 

有没有办法构建一个单一的查询,将执行一个日期范围内的查询,给每个日期执行一行?

我用这样的事情在过去的:

select date(a), 
(SUB QUERY WHICH RETURNS A SINGLE VALUE) 
FROM generate_series(
    (CURRENT_DATE - interval '2 months')::date, 
    CURRENT_DATE, 
    '1 day' 
) s(a) 

但是这只能如果子查询返回一个值。我正在寻找一种方法来在子查询返回多个列时执行此操作(例如上面的第一个示例中)。

所以从上面的第一个例子,这将产生的结果集的查询:

date   total_order_value  number_of_orders 
01/02/2017  50      1 
02/02/2017  120     2 
03/02/2017  20      1 
04/02/2017  0      0 
05/02/2017  0      0 
etc 

回答

1

外连接到generate_series将包括其中有没有订单

select 
    d::date, 
    sum(value) as total_order_value, 
    count(id) as number_of_orders 
from 
    orders 
    right join 
    generate_series(
     (current_date - interval '2 months')::date, 
     current_date, 
     '1 day' 
    ) gs (d) on d = orders.date 
group by d 
+0

感谢的日子里,方法是有道理的,但如果我尝试使用生成系列,则会出现语法错误? – TalkingQuickly

+0

@交谈快速修复 –