SQL 案例分析:数据报表行列转换

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 案例分析:数据报表行列转换相关的知识,希望对你有一定的参考价值。

大家好,我是只谈技术不剪发的 Tony 老师。

今天给大家分享一个数据报表中的行列转换案例,如果你觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

t_score是一个记录学生成绩的数据表,表的创建脚本如下:

-- 案例一:实现行列转换
-- 创建成绩表t_score
-- sname表示学生姓名,cname表示课程名称,grade表示考试成绩
CREATE TABLE t_score(sname VARCHAR(10), cname VARCHAR(10), grade INTEGER);

-- 插入测试数据
INSERT INTO t_score(sname, cname, grade) VALUES ('张三', '语文', 80);
INSERT INTO t_score(sname, cname, grade) VALUES ('李四', '语文', 77);
INSERT INTO t_score(sname, cname, grade) VALUES ('王五', '语文', 91);
INSERT INTO t_score(sname, cname, grade) VALUES ('张三', '数学', 85);
INSERT INTO t_score(sname, cname, grade) VALUES ('李四', '数学', 90);
INSERT INTO t_score(sname, cname, grade) VALUES ('王五', '数学', 60);
INSERT INTO t_score(sname, cname, grade) VALUES ('张三', '英语', 81);
INSERT INTO t_score(sname, cname, grade) VALUES ('李四', '英语', 69);
INSERT INTO t_score(sname, cname, grade) VALUES ('王五', '英语', 82);

其中字段 sname 表示学生姓名,cname 表示课程名称,grade 表示考试成绩。每行数据代表了一个学生一门学科的成绩。假如现在我们需要以每个学生一行数据的形式创建以下报表:

学生姓名|语文|数学|英语
-------|---|---|---
张三    | 80| 85| 81
李四    | 77| 90| 69
王五    | 91| 60| 82

那么应该如何编写查询语句?

这是一个典型行转换为列的问题,可以利用CASE表达式加上聚合函数实现。我们首先使用CASE表达式将每门学科转换为一列:

SELECT sname AS "学生姓名",
       CASE cname WHEN '语文' THEN grade ELSE 0 END AS "语文",
       CASE cname WHEN '数学' THEN grade ELSE 0 END AS "数学",
       CASE cname WHEN '英语' THEN grade ELSE 0 END AS "英语"
FROM t_score;

第 1 个 CASE 表达式用于转换学生的语文成绩,cname 等于“语文”就返回对应的成绩,否则就返回 0。同理,第 2 个和第 3 个 CASE 表达式分别用于转换数学和英语成绩。查询返回的结果如下:

学生姓名|语文|数学|英语
-------|---|---|---
张三    | 80|  0|  0
李四    | 77|  0|  0
王五    | 91|  0|  0
张三    |  0| 85|  0
李四    |  0| 90|  0
王五    |  0| 60|  0
张三    |  0|  0| 81
李四    |  0|  0| 69
王五    |  0|  0| 82

接下来我们通过分组汇总将每个学生的成绩合并成一条记录:

SELECT sname AS "学生姓名",
       SUM(CASE cname WHEN '语文' THEN grade ELSE 0 END) AS "语文",
       SUM(CASE cname WHEN '数学' THEN grade ELSE 0 END) AS "数学",
       SUM(CASE cname WHEN '英语' THEN grade ELSE 0 END) AS "英语"
FROM t_score
GROUP BY sname;

GROUP BY 子句将数据按照学生进行分组,SUM() 函数对每门学科的成绩进行求和,学科成绩加上 2 个 0 还是学科成绩。这样我们就实现了上面的报表。

本文来自图书《SQL编程思想》,配套视频地址:哔哩哔哩知乎

以上是关于SQL 案例分析:数据报表行列转换的主要内容,如果未能解决你的问题,请参考以下文章

在报表中录入数据时如何实现行列转换

在报表中录入数据时如何实现行列转换

SQL Server 使用 Pivot 和 UnPivot 实现行列转换

SQL Server 使用 Pivot 和 UnPivot 实现行列转换

SQL Server pivot行列转换案例分析

sql动态实现行列转换