SQL Server: присоединить таблицу к самой себе, чтобы отображать данные по горизонтали

У меня есть таблица, содержащая оценки учащихся (StudentsID, Subject, Year, Mark).

Я хочу отображать оценки по горизонтали для одного и того же ученика, предмета, но другого года.

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

Пример:

SQL Server: присоединить таблицу к самой себе, чтобы отображать данные по горизонтали

Я пробовал этот запрос

SELECT TOP (100) PERCENT 
    dbo.New_Portal_OldMarks.StudentID, dbo.New_Portal_OldMarks.[Student Name], 
    dbo.New_Portal_OldMarks.SubjectName, dbo.New_Portal_OldMarks.AcademicYear, 
    dbo.New_Portal_OldMarks.Class, dbo.New_Portal_OldMarks.Term1, dbo.New_Portal_OldMarks.Term2, 
    dbo.New_Portal_OldMarks.Term3, dbo.New_Portal_OldMarks.Final, 
    New_Portal_OldMarks_1.AcademicYear AS AcademicYear2, 
    New_Portal_OldMarks_1.Class AS Class2, 
    New_Portal_OldMarks_1.Term1 AS [Term1-2], 
    New_Portal_OldMarks_1.Term2 AS [Term2-2], 
    New_Portal_OldMarks_1.Term3 AS [Term3-2], 
    New_Portal_OldMarks_1.Final AS [Final-2]
FROM
    dbo.New_Portal_OldMarks 
FULL OUTER JOIN
    dbo.New_Portal_OldMarks AS New_Portal_OldMarks_1 ON dbo.New_Portal_OldMarks.StudentID = New_Portal_OldMarks_1.StudentID 
                                                     AND dbo.New_Portal_OldMarks.SubjectName = New_Portal_OldMarks_1.SubjectName
WHERE     
    (dbo.New_Portal_OldMarks.StudentID = 1004000)
ORDER BY 
    AcademicYear2

Я попробовал все запросы на соединение (например, JOIN, LEFT JOIN, RIGHT JOIN и т. д.), но все они возвращают неправильные результаты.

Какой sql вы используете? (mysql, mssql...)

Ryan Nghiem 27.05.2019 10:33

Microsoft SQL-сервер

Ammar 27.05.2019 10:36

Вы должны создать временную таблицу с динамическими столбцами. Создайте там столбцы с каждым годом

Ryan Nghiem 27.05.2019 10:55

@RyanNghiem Спасибо, попробую.

Ammar 27.05.2019 11:16
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать условную агрегацию:

SELECT om.ID, om.StudentID, om.[Student Name], om.SubjectName,
       MAX(CASE WHEN om.class = 11 THEN academicyear END) as academicyear,
       MAX(CASE WHEN om.class = 11 THEN class END) as class,
       MAX(CASE WHEN om.class = 11 THEN term1 END) as term1,
       MAX(CASE WHEN om.class = 11 THEN term2 END) as term2,
       MAX(CASE WHEN om.class = 11 THEN term3 END) as term3,
       MAX(CASE WHEN om.class = 11 THEN final END) as final,
       MAX(CASE WHEN om.class = 12 THEN academicyear END) as academicyear,
       MAX(CASE WHEN om.class = 12 THEN class END) as class,
       MAX(CASE WHEN om.class = 12 THEN term1 END) as term1,
       MAX(CASE WHEN om.class = 12 THEN term2 END) as term2,
       MAX(CASE WHEN om.class = 12 THEN term3 END) as term3,
       MAX(CASE WHEN om.class = 12 THEN final END) as final              
FROM dbo.New_Portal_OldMarks om
GROUP BY om.ID, om.StudentID, om.[Student Name], om.SubjectName

Другие вопросы по теме