User 14184581 Ответов: 1

Какой SQL запрос я должен написать, чтобы извлечь данные из трех разных столбцов и в то же время сделать арифметику для одного из них


Я пытаюсь извлечь некоторые данные с помощью SQL-запросов из различных таблиц, которые я уже создал. Эти таблицы выглядят следующим образом:

CREATE TABLE Students 
(
Student_ID INTEGER PRIMARY KEY,
Enrollment_Year DATE,
Course_Current_Status VARCHAR(18), 
First_Name TEXT,
Last_Name TEXT,
Gender TEXT,
Date_Of_Birth DATE,
Email TEXT,
CourseCode INTEGER REFERENCES Courses(CourseCode)
);

CREATE TABLE Modules 
(
Module_Code INTEGER PRIMARY KEY,
Module_Name TEXT, 
Module_Credits INTEGER,
Module_Level INTEGER,
ConvenerID INTEGER REFERENCES Conveners(ConvenerID)
);

CREATE TABLE Enrollment 
(
Marks_Obtained INTEGER,
Module_Code INTEGER REFERENCES Modules(Module_Code),
Student_ID INTEGER REFERENCES Students(Student_ID),
Program_Year_When_Enrolled TEXT, 
PRIMARY KEY(Module_Code, Student_ID)
);


Я хочу показать три столбца с моим запросом:

Student_ID, Average_Second_Year_Marks, Average_Third_Year_Marks, Overall_Marks
То, что я хочу сделать, это извлечь данные для студентов, окончивших школу в 2017 году, т. е. Course_Current_Status = 'Graduated-2017'

На второй год отмечается зачисление.Program_Year_When_Enrolled = 'второй' и на третий год отмечает зачисление.Program_Year_When_Enrolled = 'Третий'. Для общих отметок по запросу должен быть создан новый столбец, то есть общие отметки, которые будут составлять 1/3 от отметок второго года и 2/3 от отметок третьего года.

Что я уже пробовал:

То, что я использую, заключается в следующем:

SELECT 
Students.Student_ID, 
AVG (Enrollement.Marks_obtained WHERE Enrollment.Program_Year_When_Enorolled = 'Third' ) AS avg_third_year_marks,
AVG (Enrollement.Marks_obtained WHERE Enrollment.Program_Year_When_Enorolled = 'Second' ) AS avg_third_year_marks
SUM (avg_third_year_marks*2/3 +avg_second_year_marks*1/3)
FROM 
Students LEFT JOIN
Enrollment ON Students.Student_ID=Enrollment.Student_ID
WHERE 
Students.Course_Current_Year='Graduated-2017'
GROUP BY 
Students.Student_ID

1 Ответов

Рейтинг:
2

Steve Grattan

Вы говорите, что пробовали это. Я предполагаю, что это попытка синтаксиса (а не возврат неверных результатов), поскольку есть ошибки:

1. Регистрацию не имя таблицы - должно быть зачисление
2. Program_Year_When_Enorolled - это опечатка, не так ли?
3. avg_third_year_marks был указан в качестве выходного столбца дважды
4. Course_Current_Year не является столбцом в таблице Students

Не могли бы вы исправить и повторить, пожалуйста. А пока я посмотрю, смогу ли я заставить его работать, используя некоторые предположения.

Вот решение, если я правильно понял вашу проблему:

SELECT *, 
Averages.avg_third_year_marks*2/3 + Averages.avg_second_year_marks*1/3 AS overall 
FROM 
(
	SELECT 
	Student_ID,
	(
		SELECT AVG(Marks_obtained) 
		FROM Students s1 
		LEFT JOIN Enrollment e1 ON s1.Student_ID=e1.Student_ID 
		WHERE s1.Student_ID=s.Student_ID 
		AND Program_Year_When_Enrolled = 'Third'
	) AS avg_third_year_marks,
	(
		SELECT AVG(Marks_obtained) 
		FROM Students s2 
		LEFT JOIN Enrollment e2 ON s2.Student_ID=e2.Student_ID 
		WHERE s2.Student_ID=s.Student_ID 
		AND Program_Year_When_Enrolled = 'Second'
	) AS avg_second_year_marks
	FROM 
	Students s
) AS Averages

- Да, большое вам спасибо, это прекрасно работает. Однако результаты не должны быть показаны для всех студентов, они должны относиться только к тем студентам, чей Course_Current_Year в таблице студентов является "Graduated-2017". Не могли бы вы сказать мне, как разместить это дополнительное ограничение? Спасибо снова"

Я переставил сообщение, так как отвечал неправильно, и теперь потерял ваш ответ. Сожалеть об этом...

Как я уже сказал в своем первоначальном посте нет никакой колонки Студенты.Course_Current_Year так что я не уверен, как вы можете этого достичь. Дайте мне знать, если вам нужно сначала исправить свое определение таблицы, и мы перейдем оттуда.


The_Legend_99

Привет Стив,

Не смог получить доступ к своей учетной записи, поэтому создал новую, но я разобрался с этим, используя дополнительное предложение where. Еще раз большое вам спасибо

Steve Grattan

Рад помочь