1. 行转列

1.1 伪 SQL


select 分组列,
    聚合函数(case 转换列 when 转换列值1 then 数据列 else .... end) as 列名1,    
    聚合函数(case 转换列 when 转换列值2 then 数据列 else .... end) as 列名2,
    聚合函数(case 转换列 when 转换列值3 then 数据列 else .... end) as 列名3
    ...
from 表名
group by 分组列;

1.2 条件 --> 结果

## 条件
 		  张三          语文          78
          张三          数学          87
          张三          英语          65
          李四          语文          88
          李四          数学          90
  	      李四          英语          98
          王五          语文          73
  	      王五          数学          88
  	      王五          英语          90

## 目标结果
		  name      语文          数学           英语
          张三       78            87            65
          李四       88            90            98
          王五       73            88            90
select name,
    max(case subject when '语文' then score else null end) as '语文',
    max(case subject when '数学' then score else null end) as '数学',
    max(case subject when '英语' then score else null end) as '英语'
from stu_score group by name;

2. 列转行

2.1 伪 SQL

select 非转换列,'转换列1' as 新转换列名,转换列1 as 新数据列名 from 表名
union all
select 非转换列,'转换列2' as 新转换列名,转换列2 as 新数据列名 from 表名
union all
select 非转换列,'转换列3' as 新转换列名,转换列3 as 新数据列名 from 表名  
order by ....;

#注:union all的所有语句的字段名都需要保持一致

2.2 条件 --> 结果

## 条件
		  name      语文          数学           英语
          张三       78            87            65
          李四       88            90            98
          王五       73            88            90

## 目标结果
 		  张三          语文          78
          张三          数学          87
          张三          英语          65
          李四          语文          88
          李四          数学          90
  	      李四          英语          98
          王五          语文          73
  	      王五          数学          88
  	      王五          英语          90
select name,'语文' as subject,语文 as 'score' from stu_score_row_columns
union all
select name,'数学' as subject,数学 as 'score' from stu_score_row_columns
union all
select name,'英语' as subject,英语 as 'score' from stu_score_row_columns
order by name;