zoukankan      html  css  js  c++  java
  • SQL实现 列转行(MySQL中)

    CREATE TABLE `grade` (

      `studyCode` varchar(20) NOT NULL DEFAULT '' COMMENT '学号',

      `subjectS` varchar(20) NOT NULL,

      `score` int(20) NOT NULL

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    INSERT INTO `grade` VALUES ('001', '数学', '120');

    INSERT INTO `grade` VALUES ('002', '数学', '130');

    INSERT INTO `grade` VALUES ('003', '数学', '125');

    INSERT INTO `grade` VALUES ('001', '英语', '130');

    INSERT INTO `grade` VALUES ('002', '英语', '140');

    INSERT INTO `grade` VALUES ('003', '英语', '135');

    INSERT INTO `grade` VALUES ('001', '国学', '110');

    INSERT INTO `grade` VALUES ('002', '国学', '136');

    INSERT INTO `grade` VALUES ('003', '国学', '145');

    SET FOREIGN_KEY_CHECKS=1;

    一,纯 列转行

    (1)SELECT  *  FROM `grade` ;

     

    2SELECT  

    studyCode 学号,

    SUM(IF(subjectS = '国学',score,0)) 国学,

    SUM(IF(subjectS = '数学',score,0)) 数学,

    SUM(IF(subjectS = '英语',score,0)) 英语

       FROM grade

    GROUP BY studyCode;

     

    *使用CASE WHEN THEN ELSE END也可以

    SELECT  

    studyCode 学号,

    SUM(CASE WHEN subjectS = '国学' THEN  score ELSE 0 END) 国学,

    SUM(CASE WHEN subjectS = '数学' THEN  score ELSE 0 END) 数学,

    SUM(CASE WHEN subjectS = '英语' THEN  score ELSE 0 END) 英语

       FROM grade

    GROUP BY studyCode;

     

    二,带统计的列转行(3种方式,A,B,C)

    A步骤:(1SELECT

    studyCode,subjectS,score FROM `grade`

    GROUP BY studyCode,subjectS WITH ROLLUP ;

     

    2

    SELECT

    studyCode,subjectS,SUM(score) FROM `grade`

    GROUP BY studyCode,subjectS WITH ROLLUP ;

     

    3SELECT studyCode,IFNULL(subjectS,'total'),SUM(score) FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP ;

     

    作为子查询

    4SELECT  

    IFNULL(xh,'total') 学号,

    SUM(IF(km like '%国学%',fs,0)) 国学,

    SUM(IF(km like '%数学%',fs,0)) 数学,

    SUM(IF(km like '%英语%',fs,0)) 英语,

    SUM(IF(km like 'total',fs,0)) total

      from(

    SELECT studyCode xh,IFNULL(subjectS,'total') km,SUM(score) fs FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP

    HAVING studyCode IS NOT NULL

    ) A

    GROUP BY xh with ROLLUP;

     

    *存在数据库中的数据有时有空格,所以此处我用了like %% 模糊查询

    SELECT  

    IFNULL(xh,'total') 学号,

    SUM(IF(km = '国学',fs,0)) 国学,

    SUM(IF(km = '数学',fs,0)) 数学,

    SUM(IF(km = '英语',fs,0)) 英语,

    SUM(IF(km = 'total',fs,0)) total

      from(

    SELECT studyCode xh,IFNULL(subjectS,'total') km,SUM(score) fs FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP

    HAVING studyCode IS NOT NULL

    ) A

    GROUP BY xh with ROLLUP;

    数据没有空格,这样用。

    B方案--利用SUM(IF()) 生成列,直接生成结果  (最简洁

    select

    ifnull(studyCode,'total')  '--',

    SUM(IF(subjectS = '国学',score,0)) 国学,

    SUM(IF(subjectS = '数学',score,0)) 数学,

    SUM(IF(subjectS = '英语',score,0)) 英语,

    SUM(score) AS TOTAL

    from grade

    group by studyCode with rollup ;

     

     

    C方案--SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total

     

    select studyCode,

    SUM(IF(subjectS = '国学',score,0)) 国学,

    SUM(IF(subjectS = '数学',score,0)) 数学,

    SUM(IF(subjectS = '英语',score,0)) 英语,

    SUM(score) AS TOTAL

    from grade

    group by studyCode

    UNION

    SELECT 'TOTAL',

    SUM(IF(subjectS = '国学',score,0)) 国学,

    SUM(IF(subjectS = '数学',score,0)) 数学,

    SUM(IF(subjectS = '英语',score,0)) 英语,

    SUM(score) AS TOTAL

    FROM grade;

  • 相关阅读:
    神经网络训练收敛的解决办法
    minSdkVersion
    onlyoffice使用
    linux系统磁盘不足处理方法
    编辑docker容器中的文件
    如何使用Java获取上传图片需要旋转的角度且获取正确方向的图片
    Java数据类型转换
    bat脚本实现jdk安装、环境变量添加及jar包运行
    java实现文件上传接口及java调用文件上传接口
    flutter常用问题查询
  • 原文地址:https://www.cnblogs.com/mjbenkyo/p/7268242.html
Copyright © 2011-2022 走看看