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

如何加入3个表并获得2个不同条件的字段?

冉弘化
2023-03-14

我有3个表格:学生,课程(重要领域点),学生课程(重要领域成绩)。

如果成绩大于或等于70,则考试通过,因此学生将获得分数。如果成绩低于70,学生将不会获得分数。如果学生的学分之和大于10,他就毕业了。

我需要选择学生姓名,他的通过分数的总和,他所有成绩的平均值。我可以选择学生姓名,他的通过分数和他通过成绩的平均数之和。但我需要所有成绩的平均值。

我写了下面的查询。

SELECT s.Name, SUM(c.CreditPoints) AS CreditPoints, AVG(sc.Grade) AS 
AverageGrade FROM Students s JOIN StudentCourse sc
ON s.Id = sc.StudentId
JOIN Courses c ON c.Id = sc.CourseIdenter code here
WHERE sc.Grade >= 70
GROUP BY s.Name
HAVING SUM(CreditPoints) > 10
ORDER BY CreditPoints

共有3个答案

爱刚捷
2023-03-14

不知道你面临什么问题。对我来说,我能看到的唯一问题是GROUP BY s。因为多个学生可能有相同的名字,并且有可能从输入集中得到意想不到的结果。您最好使用s.ID作为GROUP,如下所示-

SELECT 
....
GROUP BY s.Id  -- Change the grouping Key
HAVING SUM(CreditPoints) > 10
ORDER BY CreditPoints
张权
2023-03-14

使用条件聚合:

SELECT s.Name,
       SUM(CASE WHEN sc.Grade >= 70 THEN c.CreditPoints ELSE 0 END) AS CreditPoints_passing,
       AVG(CASE sc.Grade >= 70 THEN sc.Grade END) AS AverageGrade_passing
       AVG(sc.Grade) AS AverageGrade
FROM Students s JOIN
     StudentCourse sc
     ON s.Id = sc.StudentId JOIN
     Courses c ON c.Id = sc.CourseIdenter code here
GROUP BY s.Name
HAVING CreditPoints_passing > 10  -- I think you want only 10 passing credits here
ORDER BY CreditPoints;
常英资
2023-03-14

尽管您只想选择学生的姓名,但请确保您的也按学生id分组(我相信studenttable中有一列),因为以太会有两个同名的学生
您不能使用此条件:

WHERE sc.Grade >= 70

因为这将删除带有等级的行

select 
  s.Id, s.Name,
  sum(case when sc.grade >= 70 then c.creditpoints else 0 end) CreditPoints,
  avg(sc.grade) AverageGrade 
from students s 
inner join studentcourse sc on s.id = sc.studentid 
inner join courses c on c.id = sc.courseid
group by s.id, s.Name
having sum(case when sc.grade >= 70 then c.creditpoints else 0 end) > 10
order by CreditPoints desc;

由于您使用的是SQL Server,因此不能在<code>HAVING</code>子句中使用别名<code>CreditPoints</code>,因此必须重复<code>CASE</code>语句。

 类似资料:
  • 问题内容: 我的数据库中有三个表,一个学生,一个班级和一个作业。POJO如下: 基本上,一个学生有一个当前班级,以及一份作业清单(他被分配到的所有班级)。 我的问题是,在hibernate状态下,我想知道所有没有班级() 或 分配给属于“ 1”学年班级但已设置为 我设法制定了两个单独的标准来获得我想要的东西: 和 但是我不知道如何用or来“统一”这两个条件。 问题答案: 如果要创建包含许多对象的

  • 问题内容: 我有下面的表 我采用类似的值,在某些应用程序分页中使用 通过我也获得ID,但是,我想在子句中使用此ID,例如 但是,如何将其放在子句中? 我需要这样的东西,因为我包含超过 3000万个 记录,而实际字段却无法使用 为了处理前4个唯一组合值,我需要 为了处理接下来的4个唯一组合值,我需要在我的应用程序中使用ID,因此简而言之,我想在我的子句中使用以下提到的ID 这是我桌子的结构 如您在此

  • 问题内容: 我想知道用户是否在2个相关表中的 任何 一个条目。 桌子 用户可以有一个雇员和/或学生的条目。如何在一个查询中获取该信息?我试过了: 但是它将仅返回在 两个 表中 都有 条目的用户。 SQL Fiddle示例 问题答案: 您可以使用外部联接: 或者(如果您对EMPLOYEE或STUDENT表中的数据不感兴趣)

  • 我有三张桌子: 我想从表1中选择COL1,从表2中选择COL5,从表3中选择COL4 它喜欢两个联接表,但是当我使用以下查询时,它不起作用,COL5是空白的。 请帮忙。 PS我复制了之前的一个类似示例,但输出不同。

  • 我有点卡住了。这个问题很接近我需要的,但不完全是: [Products_Final]是订单id上带有订单表的联接表 订单表是 诸如此类 所以如果我这样做了 我想要的是基于不同水果和国家组合的的总数,因为Product_id2看起来可能是重复的顺序。 如果我做了区分,总和似乎不起作用。 我如何把这两件事结合在一起?下面的我也试过了但是接不上

  • 我正在调用一个客户端的下载服务,该服务发送回MIME数据,并试图保存一个zip文件。 该服务不仅返回文件本身,还返回其他几个MIME字段。所以当我使用entity.getContent()打开输入流时,我最终会将所有这些数据写入我的zip文件,而我只希望写入一部分“有效载荷”。我已经搜索过了,无论如何都看不到,只从内容中获得一个单独的部分。 代码如下: 生成的文件的内容如下所示。请注意,我只希望将