我想为@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
但是,我们看到有必要按字段“学生”对结果进行分组。当我们分组时,我们必须指定一个聚合函数来指定保留哪个值,以防多行具有相同的“学生”值。在这种情况下,我们使用“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 值是每个组的随机值。小心点。