练习17.聚合函数、case when、concat函数

17. 统计各科成绩各分数段人数所占百分比:课程编号,课程名称,[100-85],(85-70],(70-60],(60-0]及所占百分比

第一步:按课程分组,统计各课程分数在每个区间段的人数

SELECT 
cid,
SUM(CASE WHEN score <= 100 AND score >= 85 THEN 1 ELSE 0 END) AS '[100-85]',
SUM(CASE WHEN score < 85 AND score >= 70 THEN 1 ELSE 0 END) AS '(85-70]',
SUM(CASE WHEN score < 70 AND score >= 60 THEN 1 ELSE 0 END) AS '(70-60]',
SUM(CASE WHEN score < 60 AND score >= 0 THEN 1 ELSE 0 END) AS '(60-0]'
FROM sc
GROUP BY cid;

在这里插入图片描述

第二步:各区间人数除以该课程总人数即为百分比

SELECT 
cid,
SUM(CASE WHEN score <= 100 AND score >= 85 THEN 1 ELSE 0 END)/COUNT(*) AS '[100-85]',
SUM(CASE WHEN score < 85 AND score >= 70 THEN 1 ELSE 0 END)/COUNT(*) AS '(85-70]',
SUM(CASE WHEN score < 70 AND score >= 60 THEN 1 ELSE 0 END)/COUNT(*) AS '(70-60]',
SUM(CASE WHEN score < 60 AND score >= 0 THEN 1 ELSE 0 END)/COUNT(*) AS '(60-0]'
FROM sc
GROUP BY cid;

在这里插入图片描述
第三步:期望是带%的百分比,所以可以乘以100后,使用concat函数连接%

![SELECT 
cid,
CONCAT(SUM(CASE WHEN score <= 100 AND score >= 85 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '\[100-85\]',
CONCAT(SUM(CASE WHEN score < 85 AND score >= 70 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '(85-70\]',
CONCAT(SUM(CASE WHEN score < 70 AND score >= 60 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '(70-60\]',
CONCAT(SUM(CASE WHEN score < 60 AND score >= 0 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '(60-0\]'
FROM sc
GROUP BY cid;](https://img-blog.csdnimg.cn/885b0b9b376b4530b139f1caccdfe96b.png)

在这里插入图片描述
第四步:关联课程表,获取课程名称

SELECT
a.*,b.Cname
FROM (
SELECT 
cid,
CONCAT(SUM(CASE WHEN score <= 100 AND score > 85 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '[100-85]',
CONCAT(SUM(CASE WHEN score < 85 AND score >= 70 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '(85-70]',
CONCAT(SUM(CASE WHEN score < 70 AND score >= 60 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '(70-60]',
CONCAT(SUM(CASE WHEN score < 60 AND score >= 0 THEN 1 ELSE 0 END)/COUNT(*)*100,'%') AS '(60-0]'
FROM sc
GROUP BY cid) a
LEFT JOIN course b
ON a.cid = b.cid;

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值