Можно ли объединить два запроса SQL (MS Access) в один? - PullRequest
1 голос
/ 10 апреля 2019

Мне было интересно, можно ли было объединить два запроса в один?У меня есть два запроса SQL.Первый выводит среднюю итоговую оценку за студента в первый год.Второй выводит среднюю итоговую оценку за ученика 3-го года.

Я пытался использовать UNION, но, к сожалению, он просто сдвигает все в один столбец.Я использую SQL через MS Access.

1-й запрос:

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

2-й запрос:

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.Любая помощь высоко ценится.

Ответы [ 3 ]

0 голосов
/ 10 апреля 2019

Во-первых, немного исправьте форматирование, чтобы оно было более читабельным.

Тогда вы можете попробовать это, я думаю, что оно должно работать нормально:

 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, чтобы исключить их, чтобы избежать каких-либо проблем и тому подобного.

0 голосов
/ 10 апреля 2019

@ KevinKevin

Ваши объединения не являются хорошей практикой.Остерегайтесь "деления на нулевую ошибку", которую я добавил.

Вот пример в «обычном» 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
0 голосов
/ 10 апреля 2019

Вы должны использовать соединение. Я хотел бы внести некоторые изменения в ваш код для удобства сопровождения и, возможно, производительности, но просто чтобы дать вам идею, это должно сработать.

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
...