SQL,轻微扭曲获取每个日期的计数

时间:2017-03-16 09:52:51

标签: sql postgresql

我有订单和ordereditemline,其中ordereditemline是订单中的每一行(产品)。

每一行(产品)都有一个相关的日期。 (您可以考虑具有指定日期的票证产品)

我简化了以下表格。

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。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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);