You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询如何按学生姓名及自定义课程顺序(Math/Phys/Chem)排序

问题描述

现有两张业务表如下:

表1:学生表 T1

Student ID   Student Name
-------------------------
12           John Smith
14           Raj Sharma
15           Lee Wang
16           Anan Obi

表2:成绩表 T2

| name       | course | avg (points) |
+------------+--------+--------------+
| Anan Obi   | Math   | 96.50000     |
| Anan Obi   | Phys   | 58.00000     |
| John Smith | Math   | 86.00000     |
| John Smith | Phys   | 63.00000     |
| John Smith | Chem   | 92.50000     |
| Lee Wang   | Phys   | 78.50000     |
| Lee Wang   | Chem   | 65.00000     |
| Raj Sharma | Math   | 75.00000     |
| Raj Sharma | Phys   | 78.00000     |
| Raj Sharma | Chem   | 83.00000     |

需求说明

查询每个学生每门课程的平均分,查询结果优先按学生姓名排序,同一名学生的课程需按照Math>Phys>Chem的固定顺序排列。

你当前编写的代码仅能实现按学生姓名排序,且存在语法错误:avg函数内不能直接写类型转换逻辑,需调整写法。

解决方案

要实现自定义顺序的课程排序,可以通过CASE WHEN为不同课程分配排序权重,将权重加入ORDER BY子句即可实现需求。修改后的完整SQL语句如下:

SELECT 
    T1.[Student Name] AS name,
    T2.Course,
    CAST(AVG(T2.Points) AS FLOAT) AS 'avg (points)'
FROM T1
JOIN T2 ON T1.[Student ID] = T2.[Student ID]
GROUP BY T1.[Student ID], T1.[Student Name], T2.Course
ORDER BY 
    T1.[Student Name],
    CASE T2.Course
        WHEN 'Math' THEN 1
        WHEN 'Phys' THEN 2
        WHEN 'Chem' THEN 3
        ELSE 4
    END ASC

如果使用的是支持FIELD函数的数据库(如MySQL),还可以简化排序逻辑的写法:

ORDER BY T1.[Student Name], FIELD(T2.Course, 'Math', 'Phys', 'Chem') ASC

逻辑说明

CASE WHEN/FIELD会为每个课程匹配对应的数字权重,Math权重最高(值最小)、Chem权重最低(值最大),排序时同一学生的记录会按照权重升序排列,刚好匹配要求的课程顺序。

内容的提问来源于stack exchange,提问作者Ashish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:36:10