2017-03-16 101 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);