博客
关于我
mysql中的行转列
阅读量:389 次
发布时间:2019-03-05

本文共 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判断,将多行数据转换为单列。

核心原理

  • CASE WHEN语句:用于对每一行数据进行判断,返回指定的值或0。
  • MAX函数:用于聚合多个值,确保每个科目只显示一次最大的成绩。
  • 示例:将时间数据转行

    原始数据

    | 时间 | 值 ||------|-----|| 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

    常见问题

  • 值为空的问题:在查询结果中,某些科目可能显示为0,这表示该学生在该科目没有成绩。
  • 排序问题:在转换后,数据可能需要重新排序,确保信息易于阅读。
  • 通过以上方法,我们可以灵活地将行转列,满足不同的数据处理需求。

    转载地址:http://rsizz.baihongyu.com/

    你可能感兴趣的文章
    Mybatis【5】-- Mybatis多种增删改查那些你会了么?
    查看>>
    计算输入的一句英文语句中单词数
    查看>>
    lvs+keepalive构建高可用集群
    查看>>
    6 个 Linux 运维典型问题
    查看>>
    Failed to get D-Bus connection: Operation not permitted解决
    查看>>
    取消vim打开文件全是黄色方法
    查看>>
    一个系统部署多个tomcat实例
    查看>>
    HP服务器设置iLO
    查看>>
    从头实现一个WPF条形图
    查看>>
    使用QT实现一个简单的登陆对话框(纯代码实现C++)
    查看>>
    QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
    查看>>
    GLFW 源码 下载-编译-使用/GLAD配置
    查看>>
    针对单个网站的渗透思路
    查看>>
    Typescript 学习笔记六:接口
    查看>>
    02、MySQL—数据库基本操作
    查看>>
    OpenJDK1.8.0 源码解析————HashMap的实现(一)
    查看>>
    MySQL-时区导致的时间前后端不一致
    查看>>
    2021-04-05阅读小笔记:局部性原理
    查看>>
    go语言简单介绍,增强了解
    查看>>
    架构师入门:搭建基本的Eureka架构(从项目里抽取)
    查看>>