SQL如何实现行转列?将code_val列的值转为横向展示的方法
SQL行转列实现方案
如果你的原表包含code_val字段,需要将该字段的所有行值按顺序横向输出为多列,可参考以下实现:
1. 通用实现(支持MySQL 8.0+、PostgreSQL、Oracle、SQL Server等所有支持窗口函数的数据库)
SELECT MAX(CASE WHEN rn = 1 THEN code_val END) AS col1, MAX(CASE WHEN rn = 2 THEN code_val END) AS col2, MAX(CASE WHEN rn = 3 THEN code_val END) AS col3, MAX(CASE WHEN rn = 4 THEN code_val END) AS col4, MAX(CASE WHEN rn = 5 THEN code_val END) AS col5, MAX(CASE WHEN rn = 6 THEN code_val END) AS col6 FROM ( SELECT code_val, -- 此处替换为你实际需要的排序规则,比如按表主键id、创建时间排序 ROW_NUMBER() OVER (ORDER BY id ASC) AS rn FROM 你的实际表名 ) AS temp
2. MySQL 8.0以下版本实现(不支持窗口函数的场景)
SELECT MAX(CASE WHEN rn = 1 THEN code_val END) AS col1, MAX(CASE WHEN rn = 2 THEN code_val END) AS col2, MAX(CASE WHEN rn = 3 THEN code_val END) AS col3, MAX(CASE WHEN rn = 4 THEN code_val END) AS col4, MAX(CASE WHEN rn = 5 THEN code_val END) AS col5, MAX(CASE WHEN rn = 6 THEN code_val END) AS col6 FROM ( SELECT code_val, @row_num := @row_num + 1 AS rn FROM 你的实际表名, (SELECT @row_num := 0) AS init -- 此处替换为你实际需要的排序规则 ORDER BY id ASC ) AS temp
执行后输出结果就会匹配你需要的Null Half_day half_day Null Null Null格式,需要扩展更多列的话,只要在SELECT部分按序号新增对应的CASE WHEN分支即可。
如果行转列需要按其他字段分组(比如按用户id、日期分组,每组生成一行转列结果),只要在窗口函数里添加PARTITION BY 分组字段,外层查询末尾加上GROUP BY 分组字段即可。
内容的提问来源于stack exchange,提问作者Derp
相关产品推荐
相关产品推荐

