zoukankan      html  css  js  c++  java
  • 行转列及列转行查询

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

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

    数据库表中的内容:

    转换后:

    解析:

      行转列是将原来的subject字段的多行内容选出来,作为结果集中的不同列,并根据code进行分组显示对应的score


     mysql> select s.name 姓名,s.code 学号,

        -> sum(if(e.subject='语文',e.score,0)) 语文成绩,

        -> sum(if(e.subject='数学',e.score,0)) 数学成绩,

        -> sum(if(e.subject='英语',e.score,0)) 英语成绩

        -> from student s

        -> left join exam e

        -> on s.code=e.code

        -> group by s.code;


      ①sum()函数是为了能够使用group by根据code进行分组,因为每一个student.code对应的exam.subject='语文'的记录只有一条,所以sum()的值就等于对应那一条记录的exam.score的值。

      (正常情况下此记录都是只有一条,当然如果有多条的话,可以使用sum()、max()、avg()、min()等聚合函数也都可以达到行转列的效果)

      ②if(e.subject='语文',e.score,0)作为条件,即对所有经过group by s.code分组的e.subject='语文'的记录的e.score字段进行SUM()、MAX()、MIN()、AVG()操作,如果e.score没有值则默认为0。

      (当然使用case when then作为条件进行信息提取也是OK的)

     

    二、列转行:将sid的每个科目分数分散成一条记录显示

    数据库中的表:

    转换后:

    解析:

        使用union all将每个sname对应的多个科目的成绩的结果集加起来


     mysql> select sname,sid,'语文' as subject,语文 as score from transcript

        -> union all

        -> select sname,sid,'数学' as subject,数学 as score from transcript

        -> union all

        -> select sname,sid,'英语' as subject,英语 as score from transcript

        -> order by sname; 


     UNION与UNION ALL的区别:

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

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

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

  • 相关阅读:
    hadoop 2.5 hdfs namenode –format 出错Usage: java NameNode [-backup] |
    自己动手编译hadoop-2.5.2源码
    CentOS Linux解决Device eth0 does not seem to be present
    Liz Murray成功故事的偶然与必然(转)
    【BZOJ4242】水壶(克鲁斯卡尔重构树,BFS)
    【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)
    【agc023E】Inversions(线段树,动态规划)
    【CF183D】T-shirt(动态规划,贪心)
    【BZOJ2423】最长公共子序列(动态规划)
    【BZOJ2118】墨墨的等式(最短路)
  • 原文地址:https://www.cnblogs.com/geaozhang/p/6758364.html
Copyright © 2011-2022 走看看