mysql中的行转列

行转列

行转列一般通过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 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_43944305/article/details/110209367