【发布时间】:2020-11-10 15:01:11
【问题描述】:
我有以下 4 张桌子:
- 用户
- 学生
- 部门
- 标记
我正在尝试按 DepartmentId 获取学生总数和总分总和。例如,我的结果集应该是部门 ID 1 有 50 名学生,所有学生在跨部门的所有考试中获得的总分数为 1200。
当我需要部门总分时,下面的查询给出了正确的结果
SELECT DepartmentId, SUM([Value]) AS TotalMarks FROM [dbo].[Marks] M
WHERE CollegeId = 3
GROUP BY DepartmentId
当我只需要按部门划分的学生总数时,以下查询给出了正确的结果。
SELECT S.[DepartmentId], COUNT(U.[StudentId]) AS TotalStudents
FROM [dbo].User U
INNER JOIN dbo.[Student] S
ON U.[UserId] = S.[UserId]
INNER JOIN [dbo].Department D
ON D.[DepartmentId] = S.[DepartmentID]
WHERE D.[CollegeId] = 3 AND U.[IsFullTimeStudent] = 1
GROUP BY S.[DepartmentId]
现在,当我想使用以下查询在单个结果中按部门获取学生总数和总分数时,我遇到了问题。我的 Marks 表可以为单个用户包含多个记录,因此它会给出冗余结果。
SELECT S.[DepartmentId], COUNT(U.[StudentId]) AS TotalStudents, SUM(M.[Value]) AS TotalMarks
FROM [dbo].User U
INNER JOIN dbo.[Student] S
ON U.[UserId] = S.[UserId]
INNER JOIN [dbo].Department D
ON D.[DepartmentId] = S.[DepartmentID]
INNER JOIN [dbo].[Marks] M
ON D.[DepartmentId] = M.[DeprtmentId]
WHERE D.[CollegeId] = 3 AND U.[IsFullTimeStudent] = 1
GROUP BY S.[DepartmentId]
我的标记表有 UserId、DepartmentId、CollegeId、Value 字段。
例如:- 如果标记表中有 110 个 DepartmentId 1 条目和 1 个 FTE 学生的学生,那么在这种情况下,TotalUsers 我得到 110 个学生总数,尽管该部门只有 1 个学生,因为有 110 个条目我得到的分数是 110 名学生
有没有更简单的方法来解决这个问题?
【问题讨论】:
标签: sql-server join