Oracle数据库中如何基于指定列实现行转列?
数据表行转列实现方案
通用兼容方案
以下写法适配绝大多数主流数据库(MySQL、PostgreSQL、SQL Server、Oracle等),不需要依赖数据库专属语法:
SELECT id, date, name, MAX(CASE WHEN type = '类型1' THEN type END) AS 类型1, MAX(CASE WHEN type = '类型2' THEN type END) AS 类型2, MAX(CASE WHEN type = '类型3' THEN type END) AS 类型3 -- 有多少种type的可选值,就新增对应数量的CASE WHEN语句即可 FROM 你的实际表名 GROUP BY id, date, name;
- 实现逻辑:先按照
id、date、name三个公共维度分组,每组内通过CASE WHEN判断type值匹配情况,匹配到对应类型就返回值,不匹配默认返回空,最后通过MAX聚合函数过滤掉空值,即可得到一行对应唯一id+date+name组合的转列结果。
特定数据库简化写法
MySQL
可以用IF函数简化判断逻辑:
SELECT id, date, name, MAX(IF(type = '类型1', type, NULL)) AS 类型1, MAX(IF(type = '类型2', type, NULL)) AS 类型2, MAX(IF(type = '类型3', type, NULL)) AS 类型3 FROM 你的实际表名 GROUP BY id, date, name;
PostgreSQL
可以用FILTER语法简化条件过滤:
SELECT id, date, name, MAX(type) FILTER (WHERE type = '类型1') AS 类型1, MAX(type) FILTER (WHERE type = '类型2') AS 类型2, MAX(type) FILTER (WHERE type = '类型3') AS 类型3 FROM 你的实际表名 GROUP BY id, date, name;
补充说明:如果
type字段的取值不固定,无法提前枚举所有可能值,需要使用动态SQL生成查询语句,不同数据库的动态SQL语法有差异,可根据你使用的数据库类型查找对应动态行转列的实现方法。
内容的提问来源于stack exchange,提问作者steve jhone
相关产品推荐
相关产品推荐

