SQL进阶学习——行转列

行转列

一、找出每个同学的各科成绩

SELECT student_id,student_name
MAX(CASE WHEN subject_name = '高等数学'THEN score ELSE 0 END) AS'高等数学',
MAX(CASE WHEN subject_name = '机械原理'THEN score ELSE 0 END) AS'机械原理',
MAX(CASE WHEN subject_name = '概率论'THEN score ELSE 0 END) AS'概率论',
MAX(CASE WHEN subject_name = '几何学'THEN score ELSE 0 END) AS'几何学',
MAX(CASE WHEN subject_name = '计算机导论'THEN score ELSE 0 END) AS'计算机导论'
FROM score
GROUP BY 
student_id,student_name
ORDER BY 
student_id,student_name;

二、找出男生和女生每门课的平均成绩

# NULL不计入算数,但是0会计入

SELECT student_id,student_name
AVG(CASE WHEN subject_name = '高等数学'THEN score ELSE NULL END) AS'高等数学',
AVG(CASE WHEN subject_name = '机械原理'THEN score ELSE NULL END) AS'机械原理',
AVG(CASE WHEN subject_name = '概率论'THEN score ELSE NULL END) AS'概率论',
AVG(CASE WHEN subject_name = '几何学'THEN score ELSE NULL END) AS'几何学',
AVG(CASE WHEN subject_name = '计算机导论'THEN score ELSE NULL END) AS'计算机导论'
FROM score
GROUP BY 
gender
ORDER BY 
gender;

方法二、子查询

SELECT b.gender
MAX(CASE WHEN subject_name = '高等数学'THEN score ELSE 0 END) AS'高等数学',
MAX(CASE WHEN subject_name = '机械原理'THEN score ELSE 0 END) AS'机械原理',
MAX(CASE WHEN subject_name = '概率论'THEN score ELSE 0 END) AS'概率论',
MAX(CASE WHEN subject_name = '几何学'THEN score ELSE 0 END) AS'几何学',
MAX(CASE WHEN subject_name = '计算机导论'THEN score ELSE 0 END) AS'计算机导论'
FROM (
SELECT  a.gender,a.subject_name,avg(score) avg_score
FROM score a 
GROUP BY a.gender,a.subject_name
) b
GROUP BY 
gender
ORDER BY 
gender;

三、将同一记录中的多个词合并成一个字段以逗号间隔

       使用GROUP_CONCAT()函数

SELECT student_id,student_name
GROUP_CONCAT(subject_name),GROUP_CONCAT(score)
FROM score a
GROUP BY 
a.student_id, a.student_name;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值