SQL-запрос для сводки данных в таблице ниже - PullRequest
0 голосов
/ 24 февраля 2019

Таблица каталогов посещаемости:

Catlog Table

Как показано на рисунке выше, в классе 4 ученика с номером броска1,2,3,4.Три Учителя с именами PNT, SGP и DAP посещали один и тот же класс во время соответствующей лекции.Выше таблицы показывает полное отсутствие каждого ученика по отношению к каждому учителю.

Я хочу создать вывод следующим образом:

enter image description here

В этой таблице показано полное отсутствие каждого учащегося под лекцией соответствующего учителя.

Как получить такой результат из данной таблицы?


DDL и образец данных:

create table mytable ( TeacherID varchar(3), RollNo number, Total_Absency number);
insert into mytable values('PNT', 1, 0);
insert into mytable values('PNT', 2, 4);
insert into mytable values('PNT', 3, 0);
insert into mytable values('PNT', 4, 1);
insert into mytable values('SGP', 1, 2);
insert into mytable values('SGP', 2, 1);
insert into mytable values('SGP', 3, 1);
insert into mytable values('SGP', 4, 1);
insert into mytable values('DAP', 1, 1);
insert into mytable values('DAP', 2, 1);
insert into mytable values('DAP', 3, 1);
insert into mytable values('DAP', 4, 0);

1 Ответ

0 голосов
/ 24 февраля 2019

В Oracle используйте предложение PIVOT:

SELECT * FROM
(
  SELECT TeacherID, RollNo, Total_Absency FROM mytable
)
PIVOT 
(
  MAX(Total_Absency)
  FOR TeacherID
  IN ( 'PNT', 'SGP', 'DAP' )
)
ORDER BY RollNo

Демонстрация на скрипте БД :

ROLLNO | 'PNT' | 'SGP' | 'DAP'
-----: | ----: | ----: | ----:
     1 |     0 |     2 |     1
     2 |     4 |     1 |     1
     3 |     0 |     1 |     1
     4 |     1 |     1 |     0

Для других СУБД общим решением является использование агрегации условий:

SELECT
    RollNo,
    MAX(CASE WHEN TeacherID = 'PNT' THEN Total_Absency END) AS PNT,
    MAX(CASE WHEN TeacherID = 'SGP' THEN Total_Absency END) AS SGP,
    MAX(CASE WHEN TeacherID = 'DAP' THEN Total_Absency END) AS DAP
FROM mytable
GROUP BY RollNo
ORDER BY RollNo
...