如果几个月没有记录,如何创建每月运行总和

时间:2015-03-05 20:47:26

标签: sql postgresql

目标是在每月摘要中绘制创建订单的总量

WITH monthly_sums AS (
  SELECT
    date_trunc('month', created_at) AS month,
    sum(count(created_at)) OVER (ORDER BY date_trunc('month', created_at)) AS sum
  FROM orders
  GROUP BY date_trunc('month', created_at)
)
SELECT
  to_char(date_range.month, 'Month') AS month,
  COALESCE(monthly_sums.sum, 0) AS total
FROM generate_series('2014-10-01'::date, CURRENT_DATE, '1 month') date_range(month)
LEFT OUTER JOIN monthly_sums
ON monthly_sums.month = date_range.month;

返回:

   month   | total
-----------+-------
 October   |     0
 November  |     0
 December  |     0
 January   |     1
 February  |     0     <-- should be 1
 March     |     3
(6 rows)

从monthly_sums中选择返回:

        month        | sum
---------------------+-----
 2015-01-01 00:00:00 |   1
                     |         <-- no records created in February
 2015-03-01 00:00:00 |   3
                     |   3
(3 rows)

问题是2月份没有订单,所以总数合并为0.如何更改或重新考虑此查询以获得所需结果?

2 个答案:

答案 0 :(得分:1)

我不熟悉此构造的postgresql语法,但是所有SQL引擎用于有效实现此类操作的一般模式始终如下:

  1. 按月汇总;
  2. 从完整的所需期间连接到(1)中的聚合的左连接,将没有的总和合并为零;
  3. 按期间执行运行总结。
  4. 使用CTE或子查询连续构建1,2和3。

答案 1 :(得分:0)

根据Pieter的回答,这个改变的查询给出了正确的结果

WITH monthly_counts AS (
  SELECT
    date_trunc('month', created_at) AS month,
    count(created_at) AS count
  FROM orders
  GROUP BY date_trunc('month', created_at)
)
SELECT
  to_char(sq.month, 'Month') AS month,
  sum(sq.count) OVER (ORDER BY sq.month)
FROM
  (SELECT
    date_range.month,
    COALESCE(monthly_counts.count, 0) AS count
  FROM generate_series('2014-10-01'::date, CURRENT_DATE, '1 month') date_range(month)
  LEFT OUTER JOIN monthly_counts
  ON monthly_counts.month = date_range.month) AS sq;