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 单年按月统计总和的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用resample函数计算特定疾病按月花费总和pct_change函数计算特定疾病按月花费总和环比变化率并使用matplotlib可视化疾病按月花费总和环比变化率