• mysql行转列、列转行示例


    最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。

    借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用。

    一、行转列:将原本同一列下多行的不同内容作为多个字段,输出对应内容。

    效果图:

    数据库表中的内容:

    转换后:

    可以看出,这里行转列是将原来的f_subject字段的多行内容选出来,作为结果集中的不同列,并根据f_student_id进行分组显示对应的f_score;

    上SQL:

    select f_student_id,
    SUM(IF(f_subject='语文',f_score,0)) as '语文',
    SUM(IF(f_subject='数学',f_score,0)) as '数学',
    SUM(IF(f_subject='英语',f_score,0)) as '英语'
    from t_student_score
    GROUP BY f_student_id;

    注意点:

    1.SUM()是为了能够使用GROUP BY根据f_student_id进行分组,因为每一个student_id对应的f_subject="语文"的记录只有一条,所以SUM()的值就等于对应那一条记录的f_score的值。

    假如f_student_id ='0001' and f_subject='语文' 的记录有两条,则此时SUM()的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个student对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。

    2.IF(f_subject='语文',f_score,0)作为条件,即对所有f_subject='语文'的记录的f_score字段进行SUM()、MAX()、MIN()、AVG()操作,如果f_score没有值则默认为0;

    二、列转行:

    效果图:(上面的图位置交换)

    本质是将f_student_id 的每个科目分数分散成一条记录显示出来。

    直接上SQL:

    select f_id,f_student_id,'语文' as f_subject,f_chinese as f_score from t_student_subject
    UNION ALL
    select f_id,f_student_id,'数学' as f_subject,f_math as f_score from t_student_subject
    UNION ALL
    select f_id,f_student_id,'英语' as f_subject,f_english as f_score from t_student_subject

    这里将每个student_id对应的多个科目的成绩查出来,通过UNION ALL将结果集加起来,达到图1的效果。

    附:UNION与UNION ALL的区别(摘):

    1.对重复结果的处理:UNION会去掉重复记录,UNION ALL不会;

    2.对排序的处理:UNION会排序,UNION ALL只是简单地将两个结果集合并;

    3.效率方面的区别:因为UNION 会做去重和排序处理,因此效率比UNION ALL慢很多;

    面朝大海,春暖花开。
  • 相关阅读:
    Go微服务全链路跟踪详解
    让Windows加入域的PowerShell
    关掉Windows Firewall的PowerShell
    修改IP地址的PowerShell
    如何得知当前机器上安装的PowerShell是什么版本的?
    如何在Vblock里配置Boot from SAN
    使用MDS Switch基本命令的一个例子
    [转贴]SSL工作原理
    [转贴] 数字证书及 CA 的扫盲介绍
    什么是Copy-Only Backup? 为什么要用它?
  • 原文地址:https://www.cnblogs.com/HapLe0/p/6054132.html
Copyright © 2020-2023  润新知