1. 什么是行转列横向显示?
行转列,顾名思义就是将一行数据转换成一列数据进行显示。在数据库的查询中,我们经常需要将一些数据进行行转列的操作,通常情况下,我们会使用 CASE WHEN 等条件语句进行数据的转换,从而把行转列,方便数据的处理和展示。
2. SQL查询语句行转列横向显示实例解析
2.1 示例说明
下面我们通过一个示例来说明如何使用SQL查询语句实现行转列横向显示。
我们有一个如下所示的学生表:
CREATE TABLE student (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) DEFAULT NULL,
gender VARCHAR(2) DEFAULT NULL,
score1 INT(11) DEFAULT NULL,
score2 INT(11) DEFAULT NULL,
score3 INT(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
我们现在需要统计每个学生的三门成绩并将其转换为列显示。
数据如下:
INSERT INTO student (name,gender,score1,score2,score3)
VALUES ('张三','男',90,85,92),
('李四','男',80,92,87),
('王五','女',82,88,91),
('赵六','女',86,90,85);
现在我们可以使用如下的SQL查询语句将其行转列并横向显示:
SELECT
name,
MAX(CASE WHEN gender = '男' THEN score1 ELSE NULL END) AS '男生语文',
MAX(CASE WHEN gender = '男' THEN score2 ELSE NULL END) AS '男生数学',
MAX(CASE WHEN gender = '男' THEN score3 ELSE NULL END) AS '男生英语',
MAX(CASE WHEN gender = '女' THEN score1 ELSE NULL END) AS '女生语文',
MAX(CASE WHEN gender = '女' THEN score2 ELSE NULL END) AS '女生数学',
MAX(CASE WHEN gender = '女' THEN score3 ELSE NULL END) AS '女生英语'
FROM
student
GROUP BY
name;
上述SQL查询语句的含义是:将学生表按照姓名进行分组,然后使用 MAX(CASE WHEN) 条件语句将每个学生的三门成绩转换为列,其中语文、数学、英语各为一列,男生的成绩和女生的成绩分别在一行中显示。
2.2 示例解析
我们可以分别解析一下每个条件语句的作用:
MAX(CASE WHEN gender = '男' THEN score1 ELSE NULL END) AS '男生语文'
这个条件语句的作用是,当学生的性别为男时,将其语文成绩作为该列的数据;否则,显示为NULL。
MAX(CASE WHEN gender = '男' THEN score2 ELSE NULL END) AS '男生数学'
这个条件语句的作用是,当学生的性别为男时,将其数学成绩作为该列的数据;否则,显示为NULL。
MAX(CASE WHEN gender = '男' THEN score3 ELSE NULL END) AS '男生英语'
这个条件语句的作用是,当学生的性别为男时,将其英语成绩作为该列的数据;否则,显示为NULL。
MAX(CASE WHEN gender = '女' THEN score1 ELSE NULL END) AS '女生语文'
这个条件语句的作用是,当学生的性别为女时,将其语文成绩作为该列的数据;否则,显示为NULL。
MAX(CASE WHEN gender = '女' THEN score2 ELSE NULL END) AS '女生数学'
这个条件语句的作用是,当学生的性别为女时,将其数学成绩作为该列的数据;否则,显示为NULL。
MAX(CASE WHEN gender = '女' THEN score3 ELSE NULL END) AS '女生英语'
这个条件语句的作用是,当学生的性别为女时,将其英语成绩作为该列的数据;否则,显示为NULL。
通过上述条件语句,我们实现了将行数据转换为列数据显示的效果。
3. 总结
行转列横向显示在数据库查询中是非常常见的操作,通常使用条件语句如 CASE WHEN 等进行实现。在使用时,要根据实际场景进行调整,进行相应的聚合、分组、过滤等操作,从而使查询结果更加符合预期。