Postgresql 单年按月统计总和

Posted

技术标签:

【中文标题】Postgresql 单年按月统计总和【英文标题】:Postgresql Sum statistics by month for a single year 【发布时间】:2021-07-30 16:18:03 【问题描述】:

我在数据库中有下表:

item_id, integer item_name, character varying price, double precision user_id, integer category_id, integer date, date
1 Pizza 2.99 1 2 '2020-01-01'
2 Cinema 5 1 3 '2020-01-01'
3 Cheeseburger 4.99 1 2 '2020-01-01'
4 Rental 100 1 1 '2020-01-01'

现在我想获取一年中每个月的总价格的统计信息。它应该包括所有时间和指定时间段的所有项目以及单个类别。例如,使用这个

SELECT EXTRACT(MONTH from date),COALESCE(SUM(price), 0) 
FROM item_table
WHERE user_id = 1 AND category_id = 3 AND date BETWEEN '2020-01-01'AND '2021-01-01'
GROUP By date_part
ORDER BY date_part;

我希望得到这个:

date_part total
1 5
2 0
3 0
... ...
12 0

但是,我明白了:

date_part total
1 5

1) 如果没有找到指定类别的商品,如何获得零值? (现在它只是跳过了一个月)2) 上面的示例给出了某个时间段内所选类别的统计信息。出于我的所有目的,我需要再写 3 个查询(选择所有时间和所有类别/所有时间单一类别/单一年份所有类别)。所有这些案例都有一个独特的查询吗? (当 category_id 或 date 等参数为 null 时)

【问题讨论】:

欢迎来到 SO 社区,社区会帮助你解决你的问题,但作为回报也有一定的期望;见Tour 和How to Ask。特别是您需要提供表格定义、样本数据和该数据的预期结果 - 全部以文本形式 - 无图像 【参考方案1】:

您可以通过对包含月份编号的表进行右连接并将WHERE 条件移动到JOIN 条件中来获得“空”月份:

-- Create a temporary "table" for month numbers
WITH months AS (SELECT * FROM generate_series(1, 12) AS t(n))

SELECT months.n as date_part, COALESCE(SUM(price), 0) AS total
FROM item_table
RIGHT JOIN months ON EXTRACT(MONTH from date) = months.n
  AND user_id = 1 AND category_id = 3 AND "date" BETWEEN '2020-01-01'AND '2021-01-01'
GROUP BY months.n
ORDER By months.n;

我不太确定你想要从第二部分中得到什么,但你可以看看 Grouping Sets, Cube and Rollup。

【讨论】:

以上是关于Postgresql 单年按月统计总和的主要内容,如果未能解决你的问题,请参考以下文章

在 postgresql 中按月和年对查询结果进行分组

如何在 Postgres 中的一个表中的行之间进行划分

PostgreSQL 务实应用(二/5)插入冲突

pandas使用resample函数计算特定疾病按月花费总和pct_change函数计算特定疾病按月花费总和环比变化率并使用matplotlib可视化疾病按月花费总和环比变化率

sql Magento - 按月和年度分类的所有订单总和包括折扣总和

为日期范围按月返回多个总和