本文共 1683 字,大约阅读时间需要 5 分钟。
在数据处理中,行转列是一项常见的需求,通常通过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
我们希望将每位学生的成绩从多行转换为单行,便于查看和统计。
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中,行转列的思路与SQL Server类似,主要是通过多次CASE WHEN判断,将多行数据转换为单列。
| 时间 | 值 ||------|-----|| A | 10 || B | 20 || C | 30 |
| 时间 | 值 ||------|-----|| A | 10 || B | 20 || C | 30 |
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 |
通过以上方法,我们可以灵活地将行转列,满足不同的数据处理需求。
转载地址:http://rsizz.baihongyu.com/