首页 > 解决方案 > Postgres如何获得日期之间空数据的总和0,月份数

问题描述

我有一个表叫 sumof coin ,我试图按月获取总和硬币组。我写了查询

SELECT DATE_PART('month', date) AS MONTH,
    NULLIF(SUM(GET_COUNT),
        0) AS TOTAL
FROM SUMMARY_COINS
    AND date >= '2020-12-01'
    AND date <= '2021-05-01'
GROUP BY MONTH
ORDER BY MONTH ASC

我得到如下结果

3   22
4   77
5   34

我的愿望输出是

12     0
2      0
3      22
4      77
5      34

这里我使用的是 NULLIF,但为什么不得到月份总数 0,这个月的数据为空?

标签: postgresql

解决方案


您的表不包含所有月份的数据,这就是您的查询缺少某些月份的原因。

您可以做的是使用递归 CTE 创建一个包含所有月份的结果集,然后对您的表进行 LEFT 连接以进行聚合:

WITH RECURSIVE months(month) AS (
  SELECT 1
  UNION ALL
  SELECT month + 1 FROM months WHERE month < 6
)  
SELECT m.month,
       COALESCE(SUM(GET_COUNT), 0) total
FROM months m LEFT JOIN SUMMARY_COINS s
ON DATE_PART('month', s.date) = m.month
AND s.date >= '2021-01-01' AND s.date <= '2021-06-01'
GROUP BY m.month
ORDER BY m.month;

查看简化的演示


推荐阅读