CHill60
Подсказка - при показе результатов, которые вы получаете по сравнению с тем, что вы ожидали...
1. Не включайте ссылки на изображения - просто поместите данные в свой вопрос в виде предварительно отформатированного текста
2. Убедитесь, что ваши ожидаемые результаты используют те же данные, что и ваши фактические результаты - элементы данных в предоставленных вами изображениях не связаны друг с другом
Это также очень хорошая идея, чтобы предоставить образцы данных, которые вы запрашиваете из каждый из-за столов. Помогите нам помочь вам!
Я заинтригован тем, как вы можете показать свои фактические результаты, так как при запуске вашего запроса я получаю ошибку - "недопустимое имя столбца"Vak"". Когда я исправляю это, то начинаю получать ошибки типа "Column '#student.ID' недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY". Это вызвано расчетом для Gemiddelde
Я попытался воспроизвести ваши данные следующим образом:
CREATE TABLE #student (ID int, student_Name VARCHAR(50))
insert into #student VALUES (1, 'Harmen'), (2, 'Remon'), (3, 'Stan'), (4, 'Frans de Boer'), (6, 'Kees')
CREATE TABLE #course (ID int, course_Name varchar(50))
insert into #course VALUES (1, 'Nederlands'), (2, 'Engels'), (3, 'Programmeren')
CREATE TABLE #test (ID int, Course_ID int, test_Name varchar(50))
insert into #test VALUES (1, 1, 'Dutch test 1'), (2, 2, 'English Test 1'), (3, 3, 'Programming Test 1')
CREATE TABLE #result (student_ID int, test_ID int, Result decimal(15,2))
insert into #result VALUES (1, 1, 7), (2, 1, 9), (2, 2, 10), (3, 1, 7.5), (3, 2, 8)
Первым шагом в этом процессе является получение всех результатов вместе со средним баллом на одного студента:
SELECT (S.student_Name) AS Leerling, (C.course_Name) AS Vak, R.Result, AVG(R.Result) OVER (PARTITION BY R.student_ID)
FROM #course C
JOIN #test T ON C.ID = T.Course_ID
JOIN #result R ON T.ID = R.test_ID
JOIN #student S ON R.student_ID = S.ID
Что дает вам
Harmen Nederlands 7.00 7.000000
Remon Nederlands 9.00 9.500000
Remon Engels 10.00 9.500000
Stan Nederlands 7.50 7.750000
Stan Engels 8.00 7.750000
Затем вы можете следовать инструкциям, приведенным в этой статье
Простой способ использования Pivot в SQL-запросе[
^] чтобы получить данные в нужном вам формате, например
SELECT Leerling, ISNULL(Nederlands,0) AS Nederlands, ISNULL(Engels,0) AS Engels, ISNULL(Programmeren,0) as Programmeren, Gemiddeld
FROM
(
SELECT (S.student_Name) AS Leerling, (C.course_Name) AS Vak, R.Result, AVG(R.Result) OVER (PARTITION BY S.ID) AS Gemiddeld
FROM #course C
JOIN #test T ON C.ID = T.Course_ID
JOIN #result R ON T.ID = R.test_ID
JOIN #student S ON R.student_ID = S.ID
) as s
PIVOT
(
SUM(Result)
FOR Vak IN (Nederlands, Engels, Programmeren)
) as p
Результаты:
Leerling Nederlands Engels Program. Gemiddeld
Harmen 7.00 0.00 0.00 7.000000
Stan 7.50 8.00 0.00 7.750000
Remon 9.00 10.00 0.00 9.500000
Другие вещи, которые следует отметить
- Я использовал временные таблицы, так что вам нужно удалить символы #
- Я использовал псевдонимы, потому что не хочу тратить время на ввод полных имен таблиц
- Используя оконную функцию (AVG-OVER-PARTITION), я устранил необходимость в GROUP BY (которая преодолевает ошибки)