Sql的行列(纵横表)转换
创建表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:其中sum(N)是每次用这个sum则数字+N。
select 姓名,
SUM(case 课程 when '语文' then 分数 else 0 end) as 语文,
SUM(case 课程 when '数学' then 分数 else 0 end) as 数学,
SUM(case 课程 when '物理' then 分数 else 0 end) as 物理
from scores group by 姓名
横表转纵表
我们也先把张三和李四的语文成绩查出来。
select 姓名,
'语文' as 课程,
语文 as 分数
from scores2
结果:
还有两科的数据怎么办呢? 很简单,我们一个个都查出来,然后用 union all 把他们组合为一张表就可以了。
select 姓名,
'语文' as 课程,
语文 as 分数
from scores2
union all
select 姓名,
'数学' as 课程,
数学 as 分数
from scores2
union all
select 姓名,
'物理' as 课程,
物理 as 分数
from scores2
order by 姓名 desc
结果: