COUNT和GROUP BY随着时间的推移

时间:2011-07-28 20:20:55

标签: sql postgresql count group-by

我需要在PostgreSQL中按日,周,月等创建销售报告。我有以下表格设置:

tbl_products:
    id INT
    name VARCHAR

tbl_purchase_order:
    id INT
    order_timestamp TIMESTAMP

tbl_purchase_order_items:
    id INT
    product_id INT (FK to tbl_products.id)
    order_id (FK to tbl_purchase_order.id)

我需要创建一个SQL查询,该查询返回在给定时间范围内购买给定产品的次数。也就是说,我需要查询给定产品ID在特定月份,日,年等的采购订单项中出现的次数。在之前的问题中,我学习了如何使用date_trunc()将TIMESTAMP列截断为我关心的那段时间。现在我面临着如何正确执行COUNT和GROUP BY。

我尝试了使用COUNT(XXX)和GROUP BY XXX的各种组合的几个查询,但似乎从来没有想出我期待的内容。有人可以给我指导如何构建此查询吗?我更像是一名Java开发人员,所以我仍然在加速SQL查询。感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:4)

每年计数:

SELECT oi.product_id, 
       extract(year from po.order_timestamp) as order_year
       count(*)
FROM purchase_order_items oi
   JOIN purchase_order po ON po.id = oi.order_id
GROUP BY extract(year from po.order_timestamp)

每月计数器:

SELECT oi.product_id, 
       extract(month from po.order_timestamp) as order_month
       extract(year from po.order_timestamp) as order_year
       count(*)
FROM purchase_order_items oi
   JOIN purchase_order po ON po.id = oi.order_id
GROUP BY extract(year from po.order_timestamp), 
         extract(month from po.order_timestamp)

答案 1 :(得分:1)

请参阅postgres日期时间函数http://www.postgresql.org/docs/8.1/static/functions-datetime.html

我建议您使用提取功能,将年,月和日拆分为结果集中的谨慎列,然后根据您的要求进行分组。