我希望能够补充一下@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值是每个组中随机的一个值。请注意这一点。