zoukankan      html  css  js  c++  java
  • mysql的行转列以及with rollup求和

     

    create table t_score(
    id int primary key auto_increment,
    name varchar(20) not null,  #名字
    Subject varchar(10) not null, #科目
    Fraction double default 0  #分数
    );
    -- 插入数据
    INSERT
    INTO `t_score`(name,Subject,Fraction) VALUES ('王海', '语文', 86), ('王海', '数学', 83), ('王海', '英语', 93), ('陶俊', '语文', 88), ('陶俊', '数学', 84), ('陶俊', '英语', 94), ('刘可', '语文', 80), ('刘可', '数学', 86), ('刘可', '英语', 88), ('李春', '语文', 89), ('李春', '数学', 80), ('李春', '英语', 87);

    方法一、if

    select name as 名字 ,
    sum(if(Subject='语文',Fraction,0)) as 语文,
    sum(if(Subject='数学',Fraction,0))as 数学, 
    sum(if(Subject='英语',Fraction,0))as 英语,
    round(AVG(Fraction),2) as 平均分,
    SUM(Fraction) as 总分
    from t_score group by name     
    union
    select name as 名字 , sum(语文) Chinese,sum(数学) Math,sum(英语) English,round(AVG(总分),2)as 平均分,sum(总分) score  from(
    select 'TOTAL' as name,
    sum(if(Subject='语文',Fraction,0)) as 语文,
    sum(if(Subject='数学',Fraction,0))as 数学, 
    sum(if(Subject='英语',Fraction,0))as 英语,
    SUM(Fraction) as 总分
    from t_score group by Subject )t

    上面简单的语句更新了我以往的写sql的习惯

    -- oracle语法

    select
    name as 名字 , sum(case when subject='语文' then score else '0' end) 语文, sum(case when subject='数学' then score else '0' end) 数学, sum(case when subject='英语' then score else '0' end) 英语, round(AVG(score),2) as 平均分, sum(score)/count(*) , SUM(score) as 总分 from lagfunction group by name -- 2.0在oracle中自己常用的习惯 select name ,sum(A),sum(B),sum(C) ,(sum(A)+sum(B)+sum(C) )/count(*) from ( select NAME ,SCORE AS A,0 AS B,0 AS c from lagfunction WHERE subject='语文' union select NAME ,0 AS A,SCORE AS B,0 AS c from lagfunction WHERE subject='数学' union select NAME ,0 AS A,0 AS B,SCORE AS c from lagfunction WHERE subject='英语' )c GROUP BY NAME

    发现自己以往写作习惯真是太基础了,

    方法二、case

    select  name as Name,
    sum(case when Subject = '语文' then Fraction end) as Chinese,
    sum(case when Subject = '数学' then Fraction end) as Math,
    sum(case when Subject = '英语' then Fraction end) as English,
    sum(fraction)as score
    from t_score group by name
    UNION ALL
    select  name as Name,sum(Chinese) as Chinese,sum(Math) as Math,sum(English) as English,sum(score) as score from(
    select 'TOTAL' as name,
    sum(case when Subject = '语文' then Fraction end) as Chinese,
    sum(case when Subject = '数学' then Fraction end) as Math,
    sum(case when Subject = '英语' then Fraction end) as English,
    sum(fraction)as score
    from t_score group by Subject)t

    方法三、使用with rollup

    select 
            ifnull(name,'TOll') name,
            sum(if(Subject='语文',Fraction,0)) as 语文,
           sum(if(Subject='英语',Fraction,0)) as 英语,
           sum(if(Subject='数学',Fraction,0))as 数学,
           sum(Fraction) 总分
            from t_score group by name with rollup

    with rollup的作用是在最下面加上一行总的求和,看下图,当涉及到avg的时候,该函数智能的求了个总的平均,有意思!

    参考:https://www.cnblogs.com/weibanggang/p/9679301.html

  • 相关阅读:
    html5 canvas 渐变
    html5 canvas 画直线
    html5在canvas中插入图片
    Window文件夹右击菜单定制
    HTML中解决双击会选中文本的问题
    Linux 下修改mysql 字符集编码
    mysqlimport导入命令使用
    PAM 2500 荧光数据导出数据整合脚本
    Resources for Ecology and Evolution
    Plant Ecology Journal Club, 分享主题和文献列表 825, 2019年春
  • 原文地址:https://www.cnblogs.com/thomasbc/p/15562622.html
Copyright © 2011-2022 走看看