2017-03-16 97 views
0

我有订单,并且orderitemline其中orderitemline是订单中的每行(产品)。SQL,获取轻微扭曲的每个日期的计数

每行(产品)都有关联的日期。 (你可以想象一张具有指定日期的票据产品)

我简化了表格,如下所示。

create table order (
id integer NOT NULL, 
) 


CREATE TABLE order_ordereditemline (
    id integer NOT NULL, 
    order_id integer NOT NULL, 
    date_at date, 
    ); 

对于给定的日期范围,我想获得每个日期的订单计数。
([8/11:3,8/12:0,8/13:4 ...])

8/11: 3意味着有3个数量级,其具有至少与date_at 8/11的线。

这可能是在一个日期范围内共有100个订单,每个日期的计数总和100

不知道这是可能的SQL .. 我使用Postgres的可能超过,如果它很重要。

+0

您需要一个GROUP BY,并结合COUNT(*)。 – jarlh

+0

我以为按群组划分成不相交的集合。但我需要多次计算一些订单。 – eugene

+0

如果在该日期没有订单行,但是在指定的日期范围内,您是否需要显示日期? – chillysapien

回答

1

您可以通过使用计数和组基于连接表

select t1.id, date(t2.date_at), count(*) 
from order 
inner join order_ordereditemline t2 on t1.id = t2.order_id 
group by t1.id, date(t2.date_at) 
date(t2.date_at) 

,如果您需要汇总的日期值只有你可以

select date(t2.date_at), count(*) 
from order 
inner join order_ordereditemline t2 on t1.id = t2.order_id 
group by date(t2.date_at) 
order by date(t2.date_at) 
+0

每个(order/date_at)计数显示都不计数吗?而不是每个date_at? – eugene

+0

答案更新..希望是你正在寻找的帽子.. – scaisEdge

0

我不能尝试以下方法,但做你认为它可以帮助你(可能是我不明白你的问题)? (它仅使用一个表):

SELECT DATE_AT, COUNT(*) AS NUM_ORD_DAT 
    (SELECT ID, DATE_AT 
    FROM ORDER_ORDEREDITEMLINE 
    GROUP BY ID, DATE_AT 
    ) A 
GROUP BY DATE_AT 
1

可以使用generate_series() function计算的日期,当你有没有数据都:

select date '2016-08-11' + d, count(distinct order_id) 
from  generate_series(0, date '2016-08-14' - date '2016-08-11') d 
left join order_ordereditemline on date_at = date '2016-08-11' + d 
group by 1 

或者,在事先准备好的声明中友好的格式:

select :start_date + d, count(distinct order_id) 
from  generate_series(0, :end_date - :start_date) d 
left join order_ordereditemline on date_at = :start_date + d 
group by 1 
0

我以为我的问题很清楚,但我想这不是。

以下是我想出的答案,虽然我不确定它是否最好或不是愚蠢的答案。

select date(t3.date_at), count(*) 
from (
    select t1.id, date(t2.date_at) as date_at, count(*) 
    from o t1 
     inner join line t2 on t1.id = t2.order_id 
    group by t1.id, date(t2.date_at)) t3 
group by date(t3.date_at);