Sql的行列(纵横表)转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Sql的⾏列(纵横表)转换
创建表scores
⼀、传统的⾏列转换
纵表转横表
我们要转成的横表是这样⼦的:
既然这个表只有两列,那么可以根据姓名进⾏分组。

先把姓名拼凑出来,后⾯的分数我们再想办法。

select姓名from scores group by 姓名
结果:
分析:
1. 我们先拿到语⽂这个科⽬的分数。

既然我们⽤到了group by 语句,这⾥肯定要⽤聚合函数来求分数。

2. ⽽且我们只需要语⽂这⼀科的成绩,分组出来的⼀共有 3列,分别是语⽂、数学、物理。

那么就需要判断科⽬来取分数。

这⾥符合我们需求的 case 语句就登场了。

它和c#中switch-case 作⽤⼀样。

sql case 语句语法:
case字段
when 值1 then 结果
when 值2 then 结果2
...
else默认结果
end
select姓名,SUM(case课程 when '语⽂' then 分数else0 end) as语⽂from scores group by 姓名
结果:
既然语⽂的分数取到了,其他科⽬改变下条件就可以了。

完整的sql:
select姓名,
SUM(case课程 when '语⽂' then 分数else0 end) as语⽂,
SUM(case课程 when '数学' then 分数else0 end) as数学,
SUM(case课程 when '物理' then 分数else0 end) as物理
from scores group by 姓名
横表转纵表
我们先把刚刚转好的表,插⼊⼀个新表Scores2中。

select姓名,
SUM(case课程 when '语⽂' then 分数else0 end) as语⽂,
SUM(case课程 when '数学' then 分数else0 end) as数学,
SUM(case课程 when '物理' then 分数else0 end) as物理
into scores2
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
结果:
但是⼤家有没有觉得很⿇烦呢?别急,我们有更简单的办法。

下⾯为⼤家介绍pivot关系运算符。

pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使⽤。

主要⽤于⾏和列的转换。

pivot纵表转横表
select
t2.姓名,
t2.数学,
t2.物理,
t2.语⽂
from Scores as t1
pivot (sum(分数) for课程in(数学,语⽂,物理)) as t2
pivot将原来表中课程字段中的数据⾏数学,语⽂,物理转换为列,并⽤sum取对应列的值。

我们只需要记住它的⽤法就可以了。

unpivot 横表转纵表
select
*
from
scores2
unpivot (分数for课程in (语⽂,数学,物理)) as t3
unpivot 将语⽂,数学,物理列转为⾏,分数为新的⼀列存放对应的值。

相关文档
最新文档