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 分数 else 0 end) as 语文 from scores group by 姓名 

结果:

既然语文的分数取到了,其他科目改变下条件就可以了。

完整的sql:

横表转纵表

我们先把刚刚转好的表,插入一个新表Scores2中。

 

 

pivot纵表转横表

 

pivot将原来表中 课程字段中的 数据行 数学,语文,物理 转换为列,并用sum取对应列的值。

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

unpivot 横表转纵表

 unpivot 将 语文,数学,物理 列转为行,分数为新的一列存放对应的值。

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值