
mysql中的行转列
CASE WHEN语句:用于对每一行数据进行判断,返回指定的值或0。 MAX函数:用于聚合多个值,确保每个科目只显示一次最大的成绩。
值为空的问题:在查询结果中,某些科目可能显示为0,这表示该学生在该科目没有成绩。 排序问题:在转换后,数据可能需要重新排序,确保信息易于阅读。
发布日期:2021-05-08 20:43:10
浏览次数:17
分类:精选文章
本文共 1683 字,大约阅读时间需要 5 分钟。
行转列:通过CASE WHEN实现数据转换
在数据处理中,行转列是一项常见的需求,通常通过CASE WHEN语句来实现。以下是关于行转列的详细说明。
学生成绩表的例子
为了更好地理解行转列,我们先来看一个典型的例子:学生成绩表。
数据结构
CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), -- 学生姓名 [Subject] NVARCHAR(30), -- 科目 [Score] FLOAT -- 成绩)
数据插入
INSERT INTO [StudentScores]SELECT 'Nick', '语文', 80INSERT INTO [StudentScores]SELECT 'Nick', '数学', 90INSERT INTO [StudentScores]SELECT 'Nick', '英语', 70INSERT INTO [StudentScores]SELECT 'Nick', '生物', 85INSERT INTO [StudentScores]SELECT 'Kent', '语文', 80INSERT INTO [StudentScores]SELECT 'Kent', '数学', 90INSERT INTO [StudentScores]SELECT 'Kent', '英语', 70INSERT INTO [StudentScores]SELECT 'Kent', '生物', 85
转换需求
我们希望将每位学生的成绩从多行转换为单行,便于查看和统计。
SQL查询
SELECT UserName, MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文', MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语', MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物'FROM dbo.[StudentScores]GROUP BY UserName
查询结果
通过上述查询,我们可以清晰地看到每位学生的所有成绩。
MySQL的实现思路
在MySQL中,行转列的思路与SQL Server类似,主要是通过多次CASE WHEN判断,将多行数据转换为单列。
核心原理
示例:将时间数据转行
原始数据
| 时间 | 值 ||------|-----|| A | 10 || B | 20 || C | 30 |
转换后
| 时间 | 值 ||------|-----|| A | 10 || B | 20 || C | 30 |
SQL查询
SELECT MAX(CASE WHEN `时间` = 'A' THEN `值` ELSE 0 END) AS `A`, MAX(CASE WHEN `时间` = 'B' THEN `值` ELSE 0 END) AS `B`, MAX(CASE WHEN `时间` = 'C' THEN `值` ELSE 0 END) AS `C`FROM 表名GROUP BY `时间`
最终结果
时间 | A值 | B值 | C值 |
---|---|---|---|
A | 10 | 0 | 0 |
B | 0 | 20 | 0 |
C | 0 | 0 | 30 |
常见问题
通过以上方法,我们可以灵活地将行转列,满足不同的数据处理需求。