博客
关于我
mysql中的行转列
阅读量:388 次
发布时间: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/

    你可能感兴趣的文章
    ForkJoinPool线程池
    查看>>
    【Struts】配置Struts所需类库详细解析
    查看>>
    Java面试题:Servlet是线程安全的吗?
    查看>>
    DUBBO高级配置:多注册中心配置
    查看>>
    Java集合总结系列2:Collection接口
    查看>>
    Linux学习总结(九)—— CentOS常用软件安装:中文输入法、Chrome
    查看>>
    大白话说Java反射:入门、使用、原理
    查看>>
    集合系列 Set(八):TreeSet
    查看>>
    JVM基础系列第11讲:JVM参数之堆栈空间配置
    查看>>
    MySQL用户管理:添加用户、授权、删除用户
    查看>>
    比技术还重要的事
    查看>>
    linux线程调度策略
    查看>>
    软中断和实时性
    查看>>
    Linux探测工具BCC(可观测性)
    查看>>
    Opentelemetry Metrics SDK
    查看>>
    流量控制--2.传统的流量控制元素
    查看>>
    SNMP介绍及使用,超有用,建议收藏!
    查看>>
    SDUT2161:Simple Game(NIM博弈+巴什博弈)
    查看>>
    51nod 1596 搬货物(二进制处理)
    查看>>
    来自星星的祝福(容斥+排列组合)
    查看>>