Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个WHERE需求构建SQL查询,其中一个有点复杂,丢失了_Sql_Sql Server - Fatal编程技术网

使用多个WHERE需求构建SQL查询,其中一个有点复杂,丢失了

使用多个WHERE需求构建SQL查询,其中一个有点复杂,丢失了,sql,sql-server,Sql,Sql Server,我正在做一个家庭作业,在哪里 我需要调查三个表格,找出那些分数较低的学生的名字 平均成绩低于3.5分,且学时不足9学时 我已经知道了如何填充少于9个学时的学生的名字,但我一直在计算他们的学时 学生表包含学生ID主键、姓名、新学年、SOP等、专业和GPA 课程表包含课程ID主键、课程名称以及该课程的学分等级 注册表包含使其成为外键的学生ID、Course1 FK、Course2、Course3和Course4 我不是在寻找“正确”的答案,而是在寻找某种方向感 到目前为止,我的问题是 SELECT

我正在做一个家庭作业,在哪里

我需要调查三个表格,找出那些分数较低的学生的名字 平均成绩低于3.5分,且学时不足9学时

我已经知道了如何填充少于9个学时的学生的名字,但我一直在计算他们的学时

学生表包含学生ID主键、姓名、新学年、SOP等、专业和GPA

课程表包含课程ID主键、课程名称以及该课程的学分等级

注册表包含使其成为外键的学生ID、Course1 FK、Course2、Course3和Course4

我不是在寻找“正确”的答案,而是在寻找某种方向感

到目前为止,我的问题是

SELECT DISTINCT NAME 
From StudentTable,EnrollmentTable,CourseTable
WHERE (GPA <3.5)

我想在GPA检查之后,我需要一些东西来分析每个学生的报名表,检查每门课程1、2等等,如果有的话!null,使用该courseID并轮询课程表以查找该课程的学分值。然后使用SUM检查是否如果DB模式由您决定,那么我将对其进行一些更改。注册表示学生和课程之间的映射。我将它简化为两列:StudentID和CourseID。如果您不想为表添加复合主键,可以添加第三列EnrollmentID

完成此操作后,您可以加入学生->注册->课程。按StudentID分组,使用HAVING子句筛选学生的总学分,并使用WHERE on Student GPA筛选


有意义吗?

如果DB模式由您决定,那么我会对其进行一些更改。注册表示学生和课程之间的映射。我将它简化为两列:StudentID和CourseID。如果您不想为表添加复合主键,可以添加第三列EnrollmentID

完成此操作后,您可以加入学生->注册->课程。按StudentID分组,使用HAVING子句筛选学生的总学分,并使用WHERE on Student GPA筛选


有意义吗?

你需要得到一个给定学生的总学时,这应该引导你考虑一组学生

让我们把它分解一下。首先,你希望学生的平均成绩低于3.5分,这很简单,只是:

SELECT S.Id, S.Name
FROM Student S
WHERE S.GPA < 3.5
将其与第一个查询相结合:

SELECT S.Id, S.Name
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
WHERE S.GPA < 3.5
然后,您需要实际的课程来获得CreditHourRating:

SELECT S.Id, S.Name, C.CreditHourRating
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
JOIN Course C
  ON E.CourseId = C.CourseId
WHERE S.GPA < 3.5
然后您只需要每个学生的总数,因此查询变成:

SELECT S.Id, S.Name, SUM(C.CreditHourRating)
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
JOIN Course C
  ON E.CourseId = C.CourseId
WHERE S.GPA < 3.5
GROUP BY S.Id, S.Name
最后,你有信用小时评级的条件:

SELECT S.Id, S.Name, SUM(C.CreditHourRating)
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
JOIN Course C
  ON E.CourseId = C.CourseId
WHERE S.GPA < 3.5
GROUP BY S.Id, S.Name
HAVING SUM(C.CreditHourRating) < 9

你需要得到一个给定学生的总学时,这将引导你考虑一组学生

让我们把它分解一下。首先,你希望学生的平均成绩低于3.5分,这很简单,只是:

SELECT S.Id, S.Name
FROM Student S
WHERE S.GPA < 3.5
将其与第一个查询相结合:

SELECT S.Id, S.Name
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
WHERE S.GPA < 3.5
然后,您需要实际的课程来获得CreditHourRating:

SELECT S.Id, S.Name, C.CreditHourRating
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
JOIN Course C
  ON E.CourseId = C.CourseId
WHERE S.GPA < 3.5
然后您只需要每个学生的总数,因此查询变成:

SELECT S.Id, S.Name, SUM(C.CreditHourRating)
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
JOIN Course C
  ON E.CourseId = C.CourseId
WHERE S.GPA < 3.5
GROUP BY S.Id, S.Name
最后,你有信用小时评级的条件:

SELECT S.Id, S.Name, SUM(C.CreditHourRating)
FROM Student S
JOIN
(
    SELECT StudentId, Course1 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course2 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course3 AS CourseId
    FROM Enrollment E
    UNION
    SELECT StudentId, Course4 AS CourseId
    FROM Enrollment E
) E
  ON E.StudentId = S.StudentId
JOIN Course C
  ON E.CourseId = C.CourseId
WHERE S.GPA < 3.5
GROUP BY S.Id, S.Name
HAVING SUM(C.CreditHourRating) < 9

很有意思,但不幸的是桌子是给我们的。我从未听说过HAVE子句,所以我现在正在研究它。在这种情况下,查看注册和课程之间的左联接,并对每个注册->课程关系的ISNULLCourse.CreditHour,0求和。您将得到四个左连接,它们表示每个注册->课程关系。此外,HAVING子句用于根据感兴趣的聚合函数过滤结果集,但不幸的是,表是提供给我们的。我从未听说过HAVE子句,所以我现在正在研究它。在这种情况下,查看注册和课程之间的左联接,并对每个注册->课程关系的ISNULLCourse.CreditHour,0求和。您将得到四个左连接,它们表示每个注册->课程关系。此外,HAVING子句用于根据聚合函数过滤结果集,感谢您像Fergus一样对其进行分解!!!!!工作非常完美,我现在完全理解了实现。再次感谢!谢谢你像费格斯那样把它拆了!!!!!工作非常完美,我现在完全理解了实现。再次感谢!