Я хотел бы добавить некоторые пояснения к ответу @OMG_Ponies, потому что это может быть полезно для пользователей, не являющихся суперпользователями SQL (таких, как я)
Давайте создадим пример таблицы и добавим фиктивные данные:
CREATE TABLE t (
t_ID integer primary key autoincrement not null,
student integer,
test text,
grade text
);
INSERT INTO t
(student, test, grade)
VALUES
('St1', 'T1', 'A'),
('St2', 'T1', 'B'),
('St3', 'T1', 'B'),
('St1', 'T2', 'B'),
('St2', 'T2', 'B'),
('St3', 'T2', 'A'),
('St1', 'T3', 'A'),
('St2', 'T3', 'C'),
('St3', 'T3', 'B');
Итак, у нас есть следующее:
t_ID student test grade
-------------------------
1 St1 T1 A
2 St2 T1 B
3 St3 T1 B
4 St1 T2 B
5 St2 T2 B
6 St3 T2 A
7 St1 T3 A
8 St2 T3 C
9 St3 T3 B
Используя выражение case when ... then ... end
, можно получить нужные столбцы
SELECT
t_ID,
student,
(case when t.test = 'T1' then t.grade end) as T1,
(case when t.test = 'T2' then t.grade end) as T2,
(case when t.test = 'T3' then t.grade end) as T3
FROM t
order by student
Результат
t_ID student T1 T2 T3
----------------------------------
1 St1 A NULL NULL
4 St1 NULL B NULL
7 St1 NULL NULL A
2 St2 B NULL NULL
5 St2 NULL B NULL
8 St2 NULL NULL C
3 St3 B NULL NULL
6 St3 NULL A NULL
9 St3 NULL NULL B
Однако мы видим, что необходимо сгруппировать результаты по полю «студент».Когда мы группируем, мы должны указать агрегатную функцию, чтобы указать, какое значение сохранить в случае наличия более одной строки с одним и тем же значением «student».В этом случае мы используем функцию «max», чтобы отбросить нулевые значения.
SELECT
t_ID,
student,
max(case when t.test = 'T1' then t.grade end) as T1,
max(case when t.test = 'T2' then t.grade end) as T2,
max(case when t.test = 'T3' then t.grade end) as T3
FROM t
GROUP BY student
ORDER BY student
Результат
t_ID student T1 T2 T3
-----------------------------
7 St1 A B A
8 St2 B B C
9 St3 B A B
Заключительная нота.Так как мы не сгруппировали также по t_ID и не указали для него агрегатную функцию, вы должны предположить, что значение t_ID каждой строки является случайным для каждой группы.Будьте осторожны с этим.