数据库中有以下数据
| 姓名 | 学科 | 成绩 |
| 张三 | 语文 | 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 ('语文','数学','英语') ->先提前取出所有学科,然后动态拼接
);
本文介绍了一种使用SQL进行数据重塑的方法,特别是在面对不定数量的列时如何利用Oracle 11g的PIVOT函数实现数据格式转换。通过案例演示了如何将长型数据转换为宽型数据,适用于学科成绩等数据的汇总展示。
8234

被折叠的 条评论
为什么被折叠?



