如何正确编写SQL实现按用户汇总每门课程最高分的总和?
正确的SQL查询实现方案
原SQL的问题在于子查询和用户表没有建立正确的关联关系,且子查询无法直接引用外层查询的u.Id(这就是你遇到"The multi-part identifier 'u.Id' could not be bound"错误的原因)。以下是符合需求的正确查询结构:
实现思路
- 先通过子查询计算每个用户每门课程的最高分,按用户ID和课程ID分组
- 使用左连接关联用户表和子查询,保证无成绩的用户也能被查询到
- 用
ISNULL函数将无成绩用户的总分转换为0
完整SQL语句
SELECT u.Id AS User_Id, u.UserName AS User_Name, ISNULL(SUM(x.maxScores), 0) AS Total_Score FROM Users AS u LEFT JOIN ( -- 子查询:计算每个用户每门课程的最高分 SELECT s.UserId, MAX(s.Score) AS maxScores FROM Scores AS s INNER JOIN Courses AS c ON s.CourseId = c.Id GROUP BY s.UserId, c.Id ) AS x ON u.Id = x.UserId GROUP BY u.Id, u.UserName -- 如果需要限制前3条结果,取消下面注释 -- TOP(3)
关键说明
LEFT JOIN确保所有用户(包括无成绩的)都出现在结果集中ISNULL(SUM(x.maxScores), 0)处理无成绩用户的情况:当用户没有对应分数记录时,SUM(x.maxScores)会返回NULL,用ISNULL转换为0- 子查询和用户表通过
u.Id = x.UserId建立关联,解决了原语句中无法动态关联用户ID的问题
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

