创建表scores
一、传统的行列转换
纵表转横表
我们要转成的横表是这样子的:
既然这个表只有两列,那么可以根据姓名进行分组。先把姓名拼凑出来,后面的分数我们再想办法。
select 姓名 from scores group by 姓名
结果:
分析:
- 我们先拿到语文这个科目的分数。既然我们用到了group by 语句,这里肯定要用聚合函数来求分数。
- 而且我们只需要语文这一科的成绩,分组出来的 一共有 3列 ,分别是 语文、数学、物理 。 那么就需要判断科目来取分数。
这里符合我们需求的 case 语句就登场了。它和c#中switch-case 作用一样。
sql case 语句语法:
case 字段
when 值1 then 结果
when 值2 then 结果2
...
else 默认结果
end
select 姓名,SUM(case 课程 when '语文' then 分数 else 0 end) as 语文 from scores group by 姓名
结果:
既然语文的分数取到了,其他科目改变下条件就可以了。
完整的sql:
横表转纵表
我们先把刚刚转好的表,插入一个新表Scores2中。
pivot纵表转横表
pivot将原来表中 课程字段中的 数据行 数学,语文,物理 转换为列,并用sum取对应列的值。
我们只需要记住它的用法就可以了。
unpivot 横表转纵表
unpivot 将 语文,数学,物理 列转为行,分数为新的一列存放对应的值。