关于MySQL行转列经典案例-可用下两种方法:SUM(IF(条件,列值,0))或MAX(CASE WHEN 条件 THEN  结果 END)

之前一个公司面试的笔试题,记录一下,题目如下:

1.请写出查询下表的 SQL(请注明是那个数据库产品的,如: MySQL、Oracle 等),表结构和输出结果如下。
➢表结构和数据:

ID姓名课程成绩
10000李雷语文80
10001李雷数学87
10002韩梅语文97
10003李雷英语68
10004韩梅数学53
10005张美语文90
10006张美数学94
10007韩梅英语95
10008张美英语92


输出结果:

姓名语文数学英语
张美909492
李雷808768
韩梅975395

方法1:sum(if(条件,列值,0))

条件为真时,执行列值(字段名)求和,条件为假时为0求和(当然还是0)


 MySQL执行代码如下:

SELECT t.`姓名` AS `姓名`, 
    SUM(IF(t.`课程`='语文', t.`成绩`, 0)) AS `语文`,
    SUM(IF(t.`课程`='数学', t.`成绩`, 0)) AS `数学`,
    SUM(IF(t.`课程`='英语', t.`成绩`, 0)) AS `英语`
FROM csdnTest t 
GROUP BY t.姓名

结果:

 


方法2:MAX(CASE WHEN 条件 THEN  结果 END)

case when 如果条件为真,则执行结果。如果条件为假,则end结束


 MySQL执行代码如下:

SELECT t.`姓名` AS `姓名`, 
    MAX(CASE WHEN t.`课程`='语文' THEN t.`成绩` END) AS `语文`,
    MAX(CASE WHEN t.`课程`='数学' THEN t.`成绩` END) AS `数学`,
    MAX(CASE WHEN t.`课程`='英语' THEN t.`成绩` END) AS `英语`
FROM csdnTest t 
GROUP BY t.姓名

结果:



(1)SUM() :GROUP BY根据  t.姓名  进行分组,t.姓名 对应的  t.`课程`='语文'  的记录只有一条,所以SUM() 的值就等于对应那一条记录的的值。如果有多条 t.`课程`='语文',SUM() 的值则为满足条件的累加值,如李雷一条语文成绩记录为80,另一条记录为2,则李雷语文成绩为82,所以SUM()适合一个学生的课程对应多条成绩数据,比如多学期求和。

(2)MAX() :此时 t.姓名 对应的  t.`课程`='语文'  的值将会是这多条记录里面值最大的一个。所以MAX()适合一个学生的课程对应单条成绩记录,比如单学期求和。

但是正常情况下,一个学生对应一个课程只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。

如果有错误或者不妥之处,请留言指正,Thanks……
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookies_token

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值