当前位置: 首页 > 知识库问答 >
问题:

Sql Server-使用具有更多记录的表进行连接和分组

艾翼
2023-03-14

我有以下4张桌子:

    < li >用户 <李>学生 < li >部门 < li >标记

我正在尝试按部门获取学生总数和总分。例如,我的结果集应该说部门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]

现在,当我想使用下面的查询在一个结果中获得按部门划分的学生总数和总分时,我遇到了问题。我的分数表可以为单个用户提供多个记录,因此它会给出冗余的结果。

   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]

我的标记表有用户 ID、部门 ID、学院 ID、值字段。

对于Ex :- 如果分数表中的部门Id 1有110个条目,并且有1个FTE学生的学生,那么在这种情况下,TotalUsers我得到了110个学生总数,尽管该部门只有1个学生,因为分数中有110个条目,我得到的是110个学生总数

有没有更简单的方法来解决这个问题?

共有1个答案

裘嘉木
2023-03-14

一些示例数据和表定义会很有用。我发明了自己的示例数据,它几乎应该符合您的表定义。

使用交叉应用外部应用(留档和示例)允许合并计数和求和结果。

抽样资料

create table departments
(
  departmentid int,
  departmentname nvarchar(20)
);
insert into departments (departmentid, departmentname) values
(1000, 'Business Faculty'),
(2000, 'Science Faculty' ),
(3000, 'Maintenance'     );

create table users
(
  departmentid int,
  userid int,
  username nvarchar(10),
  isfulltimestudent bit
);
insert into users (departmentid, userid, username, isfulltimestudent) values
(1000, 1, 'Alice',    1),
(1000, 2, 'Bob',      0),
(2000, 3, 'Clarence', 1),
(2000, 4, 'Britt',    0);

create table students
(
  userid int,
  studentid int
);
insert into students (userid, studentid) values
(1, 100),
(2, 200),
(3, 300);

create table marks
(
  departmentid int,
  userid int,
  mark int
);
insert into marks (departmentid, userid, mark) values
(1000, 1, 15),
(1000, 1,  8),
(1000, 2, 13),
(1000, 2, 12),
(2000, 3, 10),
(2000, 3,  7),
(2000, 3, 15),
(2000, 4, 10);

解决办法

select d.departmentname,
       ts.TotalStudents,
       tm.TotalMarks
from departments d
outer apply ( select count(1) as TotalStudents
              from users u
              where u.departmentid = d.departmentid
                and u.isfulltimestudent = 1 ) ts
outer apply ( select sum(m.mark) as TotalMarks
              from marks m
              where m.departmentid = d.departmentid ) tm;

小提琴看它在起作用。

应用解决方案

未经测试的查询,用于合并问题中的查询:

SELECT d.DepartmentId,
       tm.TotalMarks,
       ts.TotalStudents
FROM dbo.Department d
OUTER APPLY ( SELECT SUM(m.[Value]) AS TotalMarks
              FROM dbo.Marks m
              WHERE m.DepartmentId = d.DepartmentId ) tm
OUTER APPLY ( SELECT COUNT(u.StudentId) AS TotalStudents
              FROM dbo.User u
              JOIN dbo.Student s
                ON u.UserId = s.UserId
              WHERE u.IsFullTimeStudent = 1
                AND s.DepartmentId = d.DepartmentId ) ts
WHERE d.CollegeId = 3;
 类似资料:
  • 我有两张桌子如下 表1是父表,表2是子表。 如何在Oracle11g中创建连接来实现这一点。我使用sql navigator+

  • 我们可以使用以下命令轻松地从 Spark 中的 Hive 表中读取记录: 但是当我连接两个表时,例如: 如何从上面的连接查询中检索记录?

  • 我有三桌办公室,电脑和维护。办公室只是办公室的列表,电脑属于办公室以及有很多维护。 我想只使用Maintain Table中的最新条目来左联接所有表。下面的代码可以工作,但它只是在维护中对最旧的条目进行分组。 样品

  • 但是任务控制在“方法分析”面板中只显示了大约100个计数。了解整个发射过程的趋势,考察过程中哪种方法花费的时间最多,这太少了。 我如何采取更多的方法计数与飞行记录和JDK任务控制?文件中的哪个参数影响方法计数的数量?

  • 我有一个包含以下内容的xml。我想根据相关时间的值对作业进行排序。 对于每个作业,都有一个相关的时间,有两个值Num1和NUM2。 我想按这些值排序,所以如果: job1有时间1,值Num1=10,NUM2=12,而 job2有时间2,值Num1=10,NUM2=11,则输出应该是:job2,job1. 如果job3有时间3,值Num1=11,NUM2=09 输出应该是:job2,job1。 我能

  • 问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这