PostgreSQL中按特定规则计算当年与上年金额总和的方法
实现需求的SQL方案
思路说明
先计算每个年份的Amount 1总和与Amount 2总和,再通过自关联获取当前年份上一年的Amount 2总和,最后针对2023年的特殊规则做单独处理,同时用COALESCE处理无数据年份的默认值。
完整SQL代码
-- 预计算每年的金额汇总 WITH yearly_summary AS ( SELECT 年份, SUM(`Amount 1`) AS total_amount1, SUM(`Amount 2`) AS total_amount2 FROM 你的数据表名 -- 替换为实际表名 GROUP BY 年份 ) -- 关联上年数据生成最终结果 SELECT curr.年份, -- 2023年取自身Amount1总和,其余年份取自身Amount2总和 CASE WHEN curr.年份 = 2023 THEN curr.total_amount1 ELSE curr.total_amount2 END AS 当年总计, -- 上年总计取上一年的Amount2总和,无数据则显示0 COALESCE(prev.total_amount2, 0) AS 上年总计 FROM yearly_summary curr LEFT JOIN yearly_summary prev ON curr.年份 = prev.年份 + 1 ORDER BY curr.年份 DESC;
结果验证
根据你的示例数据,yearly_summary的中间计算结果为:
| 年份 | total_amount1 | total_amount2 |
|---|---|---|
| 2023 | 3000 | 4000 |
| 2022 | 6500 | 6000 |
| 2021 | 13000 | 8500 |
最终查询结果会完全匹配你需要的输出:
| 年份 | 当年总计 | 上年总计 |
|---|---|---|
| 2023 | 3000 | 6000 |
| 2022 | 6000 | 8500 |
| 2021 | 8500 | 0 |
内容的提问来源于stack exchange,提问作者Deep Patel
相关产品推荐
相关产品推荐

