横表与纵表互转

为简单起见,假设横表th如下:

姓名语文数学英语
张三839175
李四877493

相应的纵表tv为:

姓名课程成绩
张三语文83
张三数学91
张三英语75
李四语文87
李四数学74
李四英语93

横表转纵表

select 姓名, '语文' as 课程, 语文 from th
union select 姓名, '数学' as 课程, 数学 from th
union select 姓名, '英语' as 课程, 英语 from th;

纵表转横表

select t.姓名, 语文, 数学, 英语 from (select distinct 姓名 From tv) t
left join (select 姓名, 成绩 as 语文 from tv where 课程 = '语文') t1 on t.姓名 = t1.姓名
left join (select 姓名, 成绩 as 数学 from tv where 课程 = '数学') t2 on t.姓名 = t2.姓名
left join (select 姓名, 成绩 as 英语 from tv where 课程 = '英语') t3 on t.姓名 = t3.姓名;
Table of Contents