MySQL行转列与列转行详解

行转列

在数据库处理过程中,有时候我们需要将表中的数据从行的形式转换为列的形式,这样的操作称为“行转列”。这种需求通常出现在对数据进行汇总或者特定展示时。下面通过一个具体的例子来详细解释如何在MySQL中实现行转列。

示例

假设我们有一个名为TEST_TB_GRADE的成绩表,其中包含了学生姓名、课程名称以及成绩。表结构如下:

CREATE TABLE `TEST_TB_GRADE` (  
`ID` int(10) NOT NULL AUTO_INCREMENT,  
`USER_NAME` varchar(20) DEFAULT NULL,  
`COURSE` varchar(20) DEFAULT NULL,  
`SCORE` float DEFAULT '0',  
PRIMARY KEY (`ID`)  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;  

接着插入以下数据:

INSERT INTO TEST_TB_GRADE (USER_NAME, COURSE, SCORE) VALUES  
('张三', '数学', 34),  
('张三', '语文', 58),  
('张三', '英语', 58),  
('李四', '数学', 45),  
('李四', '语文', 87),  
('李四', '英语', 45),  
('王五', '数学', 76),  
('王五', '语文', 34),  
('王五', '英语', 89);  

现在我们需要将这个表格按照学生姓名分组,并将各科成绩转换为列形式。可以使用以下SQL语句实现:

SELECT USER_NAME,  
MAX(CASE WHEN COURSE = '数学' THEN SCORE ELSE 0 END) AS 数学,  
MAX(CASE WHEN COURSE = '语文' THEN SCORE ELSE 0 END) AS 语文,  
MAX(CASE WHEN COURSE = '英语' THEN SCORE ELSE 0 END) AS 英语  
FROM TEST_TB_GRADE  
GROUP BY USER_NAME;  

在这个例子中,我们使用了CASE语句来根据不同的课程名进行分组和转换。