是否可以将两个 SQL (MS Access) 查询合并为一个?

Is it possible to merge two SQL (MS Access) queries into one?

我想知道是否可以将两个查询合并为一个? 我有两个 SQL 查询。第一个输出第一年学生的平均最终分数。第二个输出三年级学生的平均最终分数。

我试过使用 UNION,但不幸的是,它只是将所有内容都移到一列中。我正在通过 MS Access 使用 SQL。

第一次查询:

SELECT Marks.Student_ID AS Year, SUM(Final_Mark)/COUNT(Marks.Student_ID) AS Year_1_Marks
FROM Marks, Students
WHERE Marks.Year_Taken = 1 AND Students.Student_ID IN
(SELECT Marks.Student_ID
FROM Marks, Students
WHERE Students.Student_ID = Marks.Student_ID) 
GROUP BY Marks.Student_ID

第二次查询:

SELECT Marks.Student_ID AS Year, SUM(Final_Mark)/COUNT(Marks.Student_ID) AS Year_3_Marks
FROM Marks, Students
WHERE Marks.Year_Taken = 3 AND Students.Student_ID IN
(SELECT Marks.Student_ID
FROM Marks, Students
WHERE Students.Student_ID = Marks.Student_ID) 
GROUP BY Marks.Student_ID

我希望将输出分成 3 列,分别是 Student_ID、Year_1_Marks、Year_3_Marks。非常感谢任何帮助。

您应该使用联接。我会对您的代码进行一些更改以提高可维护性和性能,但只是为了给您一个想法,这应该可行。

Select A.Student_ID, A.Year_1_Marks, B.Year_3_Marks
   From (
SELECT Marks.Student_ID AS Year, SUM(Final_Mark)/COUNT(Marks.Student_ID) AS Year_1_Marks
FROM Marks, Students
WHERE Marks.Year_Taken = 1 AND Students.Student_ID IN
(SELECT Marks.Student_ID
FROM Marks, Students
WHERE Students.Student_ID = Marks.Student_ID) 
GROUP BY Marks.Student_ID
) A
Join (
SELECT Marks.Student_ID AS Year, SUM(Final_Mark)/COUNT(Marks.Student_ID) AS Year_3_Marks
FROM Marks, Students
WHERE Marks.Year_Taken = 3 AND Students.Student_ID IN
(SELECT Marks.Student_ID
FROM Marks, Students
WHERE Students.Student_ID = Marks.Student_ID) 
GROUP BY Marks.Student_ID
) B On B.Student_Id = A.Student_Id

首先,稍微更正您的格式,使其更具可读性。

那你可以试试这个,我觉得应该没问题:

 SELECT Students.Student_ID as Student_ID
      , SUM(marks1.Final_Mark)/COUNT(marks1.Student_ID) AS Year_1_Marks
      , SUM(marks3.Final_Mark)/COUNT(marks3.Student_ID) AS Year_3_Marks   
   FROM Students   LEFT JOIN Marks marks1
     ON marks1.Student_ID = Students.Student_ID
     AND marks1.Year_Taken = 1   LEFT JOIN Marks marks3
     ON marks3.Student_ID = Students.Student_ID
     AND marks3.Year_Taken = 3

这会显示所有学生的分数,所以如果您有没有分数的学生,我会添加一个 WHERE 子句来排除他们,以避免出现任何问题等。

@凯文凯文

您的联接不是好的做法。当心 "division by zero error" 我已经添加了。

这里是 "normal" SQL 中的示例:

  SELECT
    Marks.Student_ID AS Year,
    (
      case when COUNT(case when Marks.Year_Taken = 1 then Marks.Student_ID else 0 end) <> 0 
      then SUM(
        case when Marks.Year_Taken = 1 then Final_Mark else 0 end
      ) / COUNT(
        case when Marks.Year_Taken = 1 then Marks.Student_ID else 0 end
      ) else 0 end
    ) AS Year_1_Marks,
    (
      case when COUNT(case when Marks.Year_Taken = 3 then Marks.Student_ID else 0 end) <> 0 
      then SUM(
        case when Marks.Year_Taken = 3 then Final_Mark else 0 end
      ) / COUNT(
        case when Marks.Year_Taken = 3 then Marks.Student_ID else 0 end
      ) else 0 end
    ) AS Year_3_Marks
  FROM
    Marks
    INNER JOIN Students ON Students.Student_ID = Marks.Student_ID
  GROUP BY
    Marks.Student_ID

这里是 "Access" SQL 中的示例:

  SELECT
    Marks.Student_ID AS Year,
      Iif ( COUNT(Iif( Marks.Year_Taken = 1 ,Marks.Student_ID, 0))=0,0,
       SUM(Iif ( Marks.Year_Taken = 1,Final_Mark, 0) ) / COUNT(Iif( Marks.Year_Taken = 1 , Marks.Student_ID, 0)) 
    ) AS Year_1_Marks,
      Iif ( COUNT(Iif( Marks.Year_Taken = 3 , Marks.Student_ID, 0))=0,0,
       SUM(Iif ( Marks.Year_Taken = 3 Final_Mark, 0) ) / COUNT(Iif( Marks.Year_Taken = 3 , Marks.Student_ID, 0)) 
    ) AS Year_3_Marks,

  FROM
    Marks
    INNER JOIN Students ON Students.Student_ID = Marks.Student_ID
  GROUP BY
    Marks.Student_ID