Как добавить столбцы в зависимости от значения таблицы - PullRequest
0 голосов
/ 11 февраля 2020

Итак, у меня есть таблица учеников, таблица отношений студентов_экзаменов и таблица экзаменов.

---------
|Student|
--------
Id
Name
Surname

-------
|Exams|
-------
Id
Result

----------------
|Students_Exams|
----------------
student_id (FK)
exam_id (FK)
ExamNumber

Итак, проблема в том, что я должен показать имя ученика + фамилия (с конкататом) и экзамены (максимальное число может быть 4 ) как столбцы и результаты экзамена. И если студент не сдал экзамен (поэтому, если на столе нет записи), он должен вернуть N / A. Таким образом, запрос на выборку должен возвращать что-то вроде

Name-Surname     Exam1  Exam2  Exam3 Exam4
--------------------------------------------------------
Keanu Reeves      82     N/A    55    65
Andy War          N/A    N/A    68    N/A

и так далее. Моя проблема показывает экзамены, как указано выше, с запросом выбора. Как я могу это сделать?

РЕДАКТИРОВАТЬ:

Что касается ответа GMB

Это дало результат ниже:

Name-Surname     Exam1  Exam2  Exam3 Exam4
--------------------------------------------------------
Keanu Reeves       82    N/A    N/A  N/A 
Keanu Reeves      N/A    N/A    N/A  N/A
Keanu Reeves      N/A    N/A    55   N/A
Keanu Reeves      N/A    N/A    N/A  65

1 Ответ

1 голос
/ 11 февраля 2020

Чтобы развернуть фиксированный список экзаменов, вы можете выполнить условное агрегирование:

select 
    concat(s.name, '-', s.surname) name_surname,
    max(case when e.name = 'Exam1' then e.result end) exam1,
    max(case when e.name = 'Exam2' then e.result end) exam2,
    max(case when e.name = 'Exam3' then e.result end) exam3,
    max(case when e.name = 'Exam4' then e.result end) exam4
from student s
inner join student_exams se on se.student_id = s.id
inner join exams e on e.id = se.exam_id
group by s.id, s.name, s.surname

Примечания:

  • это предполагает, что таблица exams имеет столбец с именем name, в котором хранится название экзамена

  • вы не можете поместить строку 'N/A' в столбец цифры c (в противном случае вам потребуется принудительно преобразовать все примечания к экзамену в виде строк вместо цифр) - приведенный выше запрос даст null для студентов, которые не сдали данный экзамен, что мне кажется уместным указанием, что этот студент не сдал этот экзамен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...