题目如图: 利用SQL语法将班级A和班级B提出来另外制作表格。
表格内容: row为各科目, colunms为各成绩段人数和各成绩段平均分数。
做完把sourcr code传给我即可。
感谢
或是跟我讲方法也可以。
SELECT CATEGORY as 'A班科目',
SUM(CASE WHEN GRADE>=80 THEN 1 ELSE 0 END) as 'A级人数80分以上',
SUM(CASE WHEN GRADE>=60 AND Grade <=79 THEN 1 ELSE 0 END) as 'B级人数60~79',
SUM(CASE WHEN GRADE>=0 AND Grade <=59 THEN 1 ELSE 0 END) as 'C级人数0~59',
floor(SUM(CASE WHEN Grade>=80 THEN Grade ELSE 0 END)/ SUM(CASE WHEN Grade>=80 THEN 1 ELSE NULL END)) as 'A级平均分数80分以上',
floor(SUM(CASE WHEN Grade>=60 AND Grade <=79 THEN Grade ELSE 0 END )*1.0/ SUM(CASE WHEN Grade>=60 AND Grade <=79 THEN 1 ELSE NULL END)) as 'B级平均分数60~79',
floor(SUM(CASE WHEN Grade>=0 AND Grade <=59 THEN Grade ELSE 0 END )*1.0/ SUM(CASE WHEN Grade>=0 AND Grade <=59 THEN 1 ELSE NULL END)) as 'C级平均分数0~59'
FROM csdn_student
WHERE ClASSID = 'A'
GROUP BY Category
CREATE TABLE `csdn_student` (
`ClASSID` varchar(45) DEFAULT NULL,
`CATEGORY` varchar(45) DEFAULT NULL,
`STUDENTID` varchar(45) DEFAULT NULL,
`GRADE` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into csdn_student values
('A','国文','A001',86),('A','数学','A001',97),('A','英文','A001',100),('A','国文','A002',33),('A','数学','A002',50),('A','英文','A002',77),('A','国文','A003',100),('A','数学','A003',30),('A','英文','A003',99),('B','国文','B001',50),('B','数学','B001',60),('B','英文','B001',70),('B','国文','B002',55),('B','数学','B002',100),('B','英文','B002',98),('B','国文','B003',1),('B','数学','B003',50),('B','英文','B003',99);
不知道lz是什么数据库,给你个各数据库通用的sql
思路很简单,就是把符合条件的数据抽出来当列就可以,lz可以试试看看只执行内层sql的结果
-- 外层循环求平均分,为了防止除0
select t.category, t.Acount, t.Bcount, t.Ccount, (case when t.Acount > 0 then t.Asum/t.Acount else null end) as Aavg, (case when t.Bcount > 0 then t.Bsum/t.Bcount else null end) as Bavg, (case when t.Cmount > 0 then t.Csum/t.Ccount else null end) as Cavg from
( --内层查询,把 各科的等级总人数和总分 分好
select category, count(case when classid='A' then 1 else 0 end) as Acount, count(case when classid='B' then 1 else 0 end) as Bcount, count(case when classid='C' then 1 else 0 end) as Ccount, sum(case when classid='A' then grade else 0 end) as Asum, sum(case when classid='B' then grade else 0 end) as Bsum, sum(case when classid='C' then grade else 0 end) as Csum from grades group by category
) t;
1、根据现有的数据表 查询新增一列 分数等级列 case when 方法(80分以上...)
2、然后基于上面查询的数据进行分组 分组字段 科目、班别、分组等级、count个数
3、最后使用行转列方法得到你要的数据
参考代码:
-- 查看原始表格
SELECT * from score;
-- 创建临时表,添加level字段
DROP TABLE IF EXISTS temp_order;
CREATE TEMPORARY TABLE temp_order AS
SELECT *,
(case when score < 60
then '04_不及格'
WHEN score >= 60 and score <70
then '03_中等'
WHEN score >= 70 and score < 90
then '02_良好'
ELSE '01_优秀'
END) AS 'level'
FROM score;
-- 临时表
SELECT * from temp_order;
-- 去重计数
SELECT level,
COUNT(DISTINCT ID) AS STU_NUM
from temp_order
GROUP BY level;
该代码使用的方法是【Sql中使用case when进行等级分组】,期望对你有所帮助,代码参考自链接:https://blog.csdn.net/coffeetogether/article/details/124371673