不使用PIVOT关键字实现单表行转列的SQL查询方法
不使用PIVOT实现SQL行转列
输入表(假设表名为 policy_data)
| Policyname | amount | type |
|---|---|---|
| PN1 | 100 | P1 |
| PN2 | 200 | P2 |
| PN3 | 300 | P3 |
| PN4 | 400 | P1 |
| PN1 | 500 | P2 |
期望输出
| Policyname | P1 | P2 | P3 |
|---|---|---|---|
| PN1 | 100 | 500 | |
| PN2 | 200 | ||
| PN3 | 300 | ||
| PN4 | 400 |
可以通过CASE表达式配合聚合函数+分组实现行转列,无需依赖PIVOT关键字,适配多数SQL方言:
SELECT Policyname, MAX(CASE WHEN type = 'P1' THEN amount END) AS P1, MAX(CASE WHEN type = 'P2' THEN amount END) AS P2, MAX(CASE WHEN type = 'P3' THEN amount END) AS P3 FROM policy_data GROUP BY Policyname ORDER BY Policyname;
逻辑说明
- 以
Policyname分组,把同一保单的所有数据聚合到一行 - 对每个目标列(P1/P2/P3),用CASE表达式判断当前行的
type是否匹配:匹配时取对应amount,不匹配则返回NULL - 用聚合函数(这里用MAX)过滤NULL值,保留每个分组下对应type的有效金额
- 如果同一保单+type存在多条记录,可替换为SUM实现求和、MIN取最小值,按需调整聚合函数
内容的提问来源于stack exchange,提问作者DIP
相关产品推荐
相关产品推荐

