用不同的参数运行类似的查询

时间:2017-03-20 14:09:02

标签: sql postgresql

我有订单和行表。

订单可以有一行或多行 一行引用产品(已购买的产品),date_at(您可以想到一张票。您可以使用此票的日期)

create table o (
 id integer NOT NULL
);


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

我正在寻找每个日期有多少bookings/reservations。 我可以获得每个日期(date_at, count)的列表

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);

现在我想要每个产品的结果。

即。我想要每个product_id,我想获得包含产品的订单的(date, count)列表(至少有一行包含product_id的订单)。

我可以在具有不同{product_id}的循环中运行以下查询,但我想可能有更好的方法

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
    where t2.product_id={product_id}
    group by t1.id, date(t2.date_at)) t3
group by date(t3.date_at);

我正在使用postgres。

1 个答案:

答案 0 :(得分:2)

您的查询似乎太复杂了。我认为这样做你想要的:

select product_id, date(date_at), count(*) as cnt
from line l
group by product_id, date(date_at)
order by product_id, date(date_at);

如果产品可以出现在订单中的多行中,请使用:

select product_id, date(date_at), count(distinct order_id) as cnt
from line l
group by product_id, date(date_at)
order by product_id, date(date_at);

您甚至不需要join返回orders。不过,我会指出,orders中的日期对我来说比lines更有意义。