PostgreSQL中实现行转列(Pivot)查询的技术需求
行转列(月份字段转列)解决方案
原始数据
| PolicyNo | Month | Amount |
|---|---|---|
| 123 | Aug-23 | 100 |
| 456 | sep-23 | 150 |
期望输出
| PolicyNo | Aug-23 | sep-23 |
|---|---|---|
| 123 | 100 | 0 |
| 456 | 0 | 150 |
1. 通用CASE WHEN写法(兼容多数数据库)
这种写法适用于MySQL、PostgreSQL、SQL Server等绝大多数数据库,兼容性拉满:
SELECT PolicyNo, SUM(CASE WHEN Month = 'Aug-23' THEN Amount ELSE 0 END) AS `Aug-23`, SUM(CASE WHEN Month = 'sep-23' THEN Amount ELSE 0 END) AS `sep-23` FROM your_table_name GROUP BY PolicyNo;
核心逻辑:用CASE WHEN匹配每条记录的月份,命中目标月份就取对应金额,否则返回0;最后按PolicyNo聚合,得到每个保单号的各月份金额。
2. PIVOT函数写法(以SQL Server为例)
如果用的是支持PIVOT的数据库(如SQL Server、Oracle),可以用更简洁的语法:
SELECT PolicyNo, ISNULL([Aug-23], 0) AS `Aug-23`, ISNULL([sep-23], 0) AS `sep-23` FROM your_table_name PIVOT ( SUM(Amount) FOR Month IN ([Aug-23], [sep-23]) ) AS PivotTable;
核心逻辑:PIVOT直接将Month字段的取值转为列,通过SUM聚合金额(单条记录下SUM/MAX/MIN效果一致);用ISNULL把无匹配值的NULL替换为0。
注意事项
- 把代码里的
your_table_name替换成你实际使用的表名 - 如果后续会新增月份,静态写法需要手动修改,这种场景建议用动态SQL自动生成列名
内容的提问来源于stack exchange,提问作者lobh
相关产品推荐
相关产品推荐

