如何实现表格行转列?基于people表的Pivot()用法咨询
问题场景
原表people结构及数据:
| first_name | id | total | type |
|---|---|---|---|
| Joe | 1234 | 13 | onsite |
| Joe | 1234 | 9 | remote |
| Jane | 4321 | 99 | remote |
| Jane | 4321 | 1 | onsite |
期望结果:
| first_name | id | onsite | remote |
|---|---|---|---|
| Joe | 1234 | 13 | 9 |
| Jane | 4321 | 1 | 99 |
解决方案
你要实现的是行转列(将type字段的不同值转为单独列),这里提供两种常用方法:
方法1:条件聚合(通用所有SQL数据库)
这是兼容性最强的写法,无需依赖特定数据库的PIVOT函数,通过CASE语句配合聚合函数实现:
SELECT first_name, id, SUM(CASE WHEN type = 'onsite' THEN total ELSE 0 END) AS onsite, SUM(CASE WHEN type = 'remote' THEN total ELSE 0 END) AS remote FROM people GROUP BY first_name, id
逻辑说明:
CASE WHEN type = 'onsite' THEN total ELSE 0 END:仅保留type为onsite的total值,其他情况赋值0SUM()聚合函数:按first_name和id分组后,汇总对应类型的total值(因每个分组下每种type仅一条数据,用MAX()替换SUM()效果一致)GROUP BY first_name, id:确保同一用户(姓名+ID相同)的记录合并为一行
方法2:使用PIVOT函数(适用于SQL Server、Oracle等支持该函数的数据库)
如果你的数据库支持PIVOT语法,可以用更简洁的方式实现:
SELECT first_name, id, onsite, remote FROM ( SELECT first_name, id, total, type FROM people ) AS source PIVOT ( SUM(total) FOR type IN (onsite, remote) ) AS pivot_table
逻辑说明:
- 子查询
source:提取需要转换的核心字段 PIVOT(SUM(total) FOR type IN (onsite, remote)):指定用SUM聚合total,将type字段的onsite和remote值转为列名- 外层查询直接选取转换后的列即可
内容的提问来源于stack exchange,提问作者sqlquestions
相关产品推荐
相关产品推荐

