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;

  • 相关阅读:
    Java暑期学习第二十天日报
    Java暑期学习第十六天日报
    Java暑期学习第十七天日报
    使用C#创建SQLServer的存储过程 附带图片
    ASP.NET树形
    什么时候使用webservice1
    ASPxGridView动态增加列
    winform中treeView使用通用类
    Winform使用C#实现Treeview节点"正在展开..."效果
    C#实现字符串加密解密类
  • 原文地址:https://www.cnblogs.com/mjbenkyo/p/7268242.html
Copyright © 2011-2022 走看看