数据库行转成列

CREATE TABLE tb(name VARCHAR(10),course VARCHAR(10),recore INT)

insert into tb VALUES ('左登超','语文',74)
insert into tb VALUES ('左登超','数学',83)
insert into tb VALUES ('左登超','物理',93)
insert into tb VALUES ('刘霖','语文',74)
insert into tb VALUES ('刘霖','数学',84)
insert into tb VALUES ('刘霖','物理',94)

select * from tb

—注意这里必须使用聚合函数 才能够运行,否则将不能运行

select name,
MAX(case course when '语文' then recore  end) '语文',
max(case course when '数学' then recore  end ) '数学',
MAX(case course when '政治' then recore  end) '政治',
max(case course when '物理' then recore  end) '物理',
sum(recore) '总分',
cast(avg(recore*1.0) as decimal(18,2)) '平均分'
 from tb
 group by name

–使用pivot 的时候需要注意
–pivot (聚合函数 for 变量 in (…)) as p
–注意一定需要这种格,否则将会出错,
–容易忘记的东西,
– 1.不使用聚合函数
—2. 最后需要通过as 来进行重新命名

select a.name,max(a.政治) '政治',max(a.数学) '数学',max(a.物理) '物理',max(a.语文) '语文'
from  tb pivot ( max(recore) for course in(语文,数学,物理,政治)) a group by name

–上面两种实现方法的优缺点
–第一种比较 好理解,扩展性比较好,可以在此基础上进行二次加工
–第二种比较难以理解,但是很好用,不需要对数据进行二次加工,直接使用,

—转置中需要添加其的东西,就需要添加另外的查询

select a.*,
        b.平均分,b.总分
 from (select * from tb pivot(max(recore) for course in(语文,数学,政治,物理)) c ) a,

  (select name,SUM(recore) 总分 ,AVG(recore) '平均分' from tb group by name) b
   where a.name=b.name

—-如何进行分课处理

—1.首先需要划分文理科
– 2. 需要按照 name 和 ‘划分的文理’ 进行排序
–值得注意的是 group by 和order by 都可以指定多个列 (进行分组排序)
– 3. 进行转置

select * from 
    (select name, SUM(recore) 分数,
       case course
     when '语文' then '文科'
     when '政治' then '文科' 
     when '数学' then '理科'
     when '物理' then '理科'
     else '其他' end '分课'
        from tb group by name, case course 
         when '语文' then '文科'
         when '政治' then '文科'
         when '数学' then '理科'
         when '物理' then '理科'
         else '其他' end ) as fenke pivot (max(分数)for 分课 in(理科,文科)) as q  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值