zoukankan      html  css  js  c++  java
  • Mysql:使用case when then end 实现行列转换

    1、创建一张表,我们这表名为 t_score

    drop table if exists t_score;
    create table t_score
    (
    	id int primary key auto_increment,
    	name varchar(20),
    	course varchar(20),
    	score double
    ) default charset = utf8;
    

    2、添加若干条数据

    insert into `t_score`(name,course,score) values
        ('王海', '语文', 86),
        ('王海', '数学', 83),
        ('王海', '英语', 93),
        ('陶俊', '语文', 88),
        ('陶俊', '数学', 84),
        ('陶俊', '英语', 94),
        ('刘可', '语文', 80),
        ('刘可', '数学', 86),
        ('刘可', '英语', 88),
        ('李春', '语文', 89),
        ('李春', '数学', 80),
        ('李春', '英语', 87);
    

    3、用case when then end 函数进行查询

    SELECT name,
    max(CASE course WHEN '语文' THEN score ELSE 0 END ) Chinese,
    max(CASE course WHEN '数学' THEN score ELSE 0 END ) math,
    max(CASE course WHEN '英语' THEN score ELSE 0 END ) English,
    sum(score) score
    FROM t_score  
    GROUP BY name
    union
    select 'TOTAL',
    sum(CASE course WHEN '语文' THEN score ELSE 0 END ),
    sum(CASE course WHEN '数学' THEN score ELSE 0 END ),
    sum(CASE course WHEN '英语' THEN score ELSE 0 END ),
    sum(score) from t_score;

    效果图:

     

    另一种方法获取所需结果

    利用with rollup 给结果集新添一行,再使用ifnull过程函数判断name的值是否为空

    select ifnull(name,'TOTAL') name,
    sum(CASE course WHEN '语文' THEN score ELSE 0 END ) Chinese,
    sum(CASE course WHEN '数学' THEN score ELSE 0 END ) math,
    sum(CASE course WHEN '英语' THEN score ELSE 0 END ) English,
    sum(score) score
    FROM t_score  
    GROUP BY name with rollup;
    

  • 相关阅读:
    没有服务商如何购买ERP的序列号?
    智能ERP主副机设置
    银盒子·序列号购买(2018-12-05)
    简易付微信收款提示支付失败
    简易付无法登录的解决方案
    Orchard详解--第八篇 拓展模块及引用的预处理
    Orchard详解--第七篇 拓展模块(译)
    Orchard详解--第六篇 CacheManager 2
    Orchard详解--第五篇 CacheManager
    Orchard详解--第四篇 缓存介绍
  • 原文地址:https://www.cnblogs.com/Qi1007/p/9671194.html
Copyright © 2011-2022 走看看