利用SQL来新定义表格并计算

题目如图: 利用SQL语法将班级A和班级B提出来另外制作表格。
表格内容: row为各科目, colunms为各成绩段人数和各成绩段平均分数。
做完把sourcr code传给我即可。
感谢
或是跟我讲方法也可以。

img

  1. 答案
    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
    
  2. 建表语句
    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;
    
  3. 插入数据
    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