行转列
行转列一般通过CASE WHEN 语句来实现
我们首先先通过一个sqlServer
下老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列
CREATE TABLE [StudentScores]
(
[UserName] NVARCHAR(20), --学生姓名
[Subject] NVARCHAR(30), --科目
[Score] FLOAT, --成绩
)
INSERT INTO [StudentScores] SELECT 'Nick', '语文', 80
INSERT INTO [StudentScores] SELECT 'Nick', '数学', 90
INSERT INTO [StudentScores] SELECT 'Nick', '英语', 70
INSERT INTO [StudentScores] SELECT 'Nick', '生物', 85
INSERT INTO [StudentScores] SELECT 'Kent', '语文', 80
INSERT INTO [StudentScores] SELECT 'Kent', '数学', 90
INSERT INTO [StudentScores] SELECT 'Kent', '英语', 70
INSERT 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其实也是一样的思路
这里的思路其实很简单,就是使用case when
对几行数据做多次的判断,每一句case when都是对所有的行进行了一次比较,然后转成想要的列,再然后利用聚合函数转为最终的一行(这个主要看最后的目的是不是需要一行).
例如下图中对time
这列数据转行
原始数据
列转行之后
在上面的基础上,再对查出来的数据做一个聚合,我这边是行转列之后,没列只有一个最大值,所以我直接利用group by 和max
函数将其聚合成一行
扫描二维码关注公众号,回复:
12639295 查看本文章