数据库中有以下数据
姓名 | 学科 | 成绩 |
张三 | 语文 | 90 |
张三 | 数学 | 80 |
李四 | 语文 | 70 |
李四 | 数学 | 85 |
需要转换成下面显示格式
姓名 | 语文 | 数学 |
张三 | 90 | 80 |
李四 | 70 | 85 |
通常做法是,使用CASE WHEN把学科分开后,再合计起来
SELECT 姓名,
SUM(
CASE WHEN 学科=‘语文’ THEN 成绩
ELSE 0
END
) AS 语文,
SUM(
CASE WHEN 学科=‘数学’ THEN 成绩
ELSE 0
END
) AS 数学
FROM 表
GROUP BY 姓名
但是,学科不是固定的情况,以上的方法就无法解决。
姓名 | 学科 | 成绩 |
张三 | 语文 | 90 |
张三 | 数学 | 80 |
李四 | 语文 | 70 |
李四 | 数学 | 80 |
李四 | 英语 | 90 |
oracle11g以前只能写PL/SQL来解决,11g后可以使用PIVOT函数来解决。
WITH pivot_data AS (
SELECT 学科, 姓名, 成绩
FROM 表
)
SELECT *
FROM pivot_data
PIVOT (
SUM(成绩)
FOR 学科
IN ('语文','数学','英语') ->先提前取出所有学科,然后动态拼接
);