1,有如下一个表,要求把这个表按照2016,2017,2018,2019,把从1月到12月的金额展示出来。

profit表:

year month amount
2019 1 5
2019 3 6
2018 3 7
2018 4 8
2018 5 9
2017 1 10
2017 2 11
2016 3 12

展现成:
year,1,2,3,4,5,6,7,8,9,10,11,12

2016,0,0,12,0,0,0,0,0,0,0,0,0

2017,10,11,0,0,0,0,0,0,0,0,0,0

2018,0,0,7,8,9,0,0,0,0,0,0,0

2019,5,0,6,0,0,0,0,0,0,0,0,0

解析:由于要展示1-12月的数据,所以先把1-12月的列列出来。每列的值都由查询对应月份的结果进行展示,4年的结果分组展示。

第一步,写出每个月的查询结果:

select amount as "1月" from profit where month="1";
select amount as "2月" from profit where month="2";
select amount as "3月" from profit where month="3";
select amount as "4月" from profit where month="4";
select amount as "5月" from profit where month="5";
select amount as "6月" from profit where month="6";
select amount as "7月" from profit where month="7";
select amount as "8月" from profit where month="8";
select amount as "9月" from profit where month="9";
select amount as "10月" from profit where month="10";
select amount as "11月" from profit where month="11";
select amount as "12月" from profit where month="12";

第二步:

将每个月的查询结果作为子查询,通过year关联

select year,
(select amount from profit m1 where m1.month="1" and m1.year=m.year) as m1,
(select amount from profit m2 where m2.month="2" and m2.year=m.year) as m2,
(select amount from profit m3 where m3.month="3" and m3.year=m.year) as m3,
(select amount from profit m4 where m4.month="4" and m4.year=m.year) as m4,
(select amount from profit m5 where m5.month="5" and m5.year=m.year) as m5,
(select amount from profit m6 where m6.month="6" and m6.year=m.year) as m6,
(select amount from profit m7 where m7.month="7" and m7.year=m.year) as m7,
(select amount from profit m8 where m8.month="8" and m8.year=m.year) as m8,
(select amount from profit m9 where m9.month="9" and m9.year=m.year) as m9,
(select amount from profit m10 where m10.month="10" and m10.year=m.year) as m10,
(select amount from profit m11 where m11.month="11" and m11.year=m.year) as m11,
(select amount from profit m12 where m12.month="12" and m12.year=m.year) as m12
from profit m group by m.year

第三步,处理Null

select year,
IFNULL((select amount from profit m1 where m1.month="1" and m1.year=m.year),0) as m1,
IFNULL((select amount from profit m2 where m2.month="2" and m2.year=m.year),0) as m2,
IFNULL((select amount from profit m3 where m3.month="3" and m3.year=m.year),0) as m3,
IFNULL((select amount from profit m4 where m4.month="4" and m4.year=m.year),0) as m4,
IFNULL((select amount from profit m5 where m5.month="5" and m5.year=m.year),0) as m5,
IFNULL((select amount from profit m6 where m6.month="6" and m6.year=m.year),0) as m6,
IFNULL((select amount from profit m7 where m7.month="7" and m7.year=m.year),0) as m7,
IFNULL((select amount from profit m8 where m8.month="8" and m8.year=m.year),0) as m8,
IFNULL((select amount from profit m9 where m9.month="9" and m9.year=m.year),0) as m9,
IFNULL((select amount from profit m10 where m10.month="10" and m10.year=m.year),0) as m10,
IFNULL((select amount from profit m11 where m11.month="11" and m11.year=m.year),0) as m11,
IFNULL((select amount from profit m12 where m12.month="12" and m12.year=m.year),0) as m12
from profit m group by m.year

结果:

增加统计当年amount

select year,sum(amount) as "当年总金额",
IFNULL((select amount from profit m1 where m1.month="1" and m1.year=m.year),0) as m1,
IFNULL((select amount from profit m2 where m2.month="2" and m2.year=m.year),0) as m2,
IFNULL((select amount from profit m3 where m3.month="3" and m3.year=m.year),0) as m3,
IFNULL((select amount from profit m4 where m4.month="4" and m4.year=m.year),0) as m4,
IFNULL((select amount from profit m5 where m5.month="5" and m5.year=m.year),0) as m5,
IFNULL((select amount from profit m6 where m6.month="6" and m6.year=m.year),0) as m6,
IFNULL((select amount from profit m7 where m7.month="7" and m7.year=m.year),0) as m7,
IFNULL((select amount from profit m8 where m8.month="8" and m8.year=m.year),0) as m8,
IFNULL((select amount from profit m9 where m9.month="9" and m9.year=m.year),0) as m9,
IFNULL((select amount from profit m10 where m10.month="10" and m10.year=m.year),0) as m10,
IFNULL((select amount from profit m11 where m11.month="11" and m11.year=m.year),0) as m11,
IFNULL((select amount from profit m12 where m12.month="12" and m12.year=m.year),0) as m12
from profit m group by m.year;

增加统计4年总金额:

select year,sum(amount) as "年度总金额",
IFNULL((select amount from profit m1 where m1.month="1" and m1.year=m.year),0) as m1,
IFNULL((select amount from profit m2 where m2.month="2" and m2.year=m.year),0) as m2,
IFNULL((select amount from profit m3 where m3.month="3" and m3.year=m.year),0) as m3,
IFNULL((select amount from profit m4 where m4.month="4" and m4.year=m.year),0) as m4,
IFNULL((select amount from profit m5 where m5.month="5" and m5.year=m.year),0) as m5,
IFNULL((select amount from profit m6 where m6.month="6" and m6.year=m.year),0) as m6,
IFNULL((select amount from profit m7 where m7.month="7" and m7.year=m.year),0) as m7,
IFNULL((select amount from profit m8 where m8.month="8" and m8.year=m.year),0) as m8,
IFNULL((select amount from profit m9 where m9.month="9" and m9.year=m.year),0) as m9,
IFNULL((select amount from profit m10 where m10.month="10" and m10.year=m.year),0) as m10,
IFNULL((select amount from profit m11 where m11.month="11" and m11.year=m.year),0) as m11,
IFNULL((select amount from profit m12 where m12.month="12" and m12.year=m.year),0) as m12
from profit m group by m.year
UNION ALL
select * from
(select '总计',sum(t2.`年度总金额`),sum(m1),sum(m2),sum(m3),sum(m4),sum(m5),sum(m6),sum(m7),sum(m8),sum(m9),sum(m10),sum(m11),sum(m12) from
(
select year,sum(amount) as "年度总金额",
IFNULL((select amount from profit m1 where m1.month="1" and m1.year=m.year),0) as m1,
IFNULL((select amount from profit m2 where m2.month="2" and m2.year=m.year),0) as m2,
IFNULL((select amount from profit m3 where m3.month="3" and m3.year=m.year),0) as m3,
IFNULL((select amount from profit m4 where m4.month="4" and m4.year=m.year),0) as m4,
IFNULL((select amount from profit m5 where m5.month="5" and m5.year=m.year),0) as m5,
IFNULL((select amount from profit m6 where m6.month="6" and m6.year=m.year),0) as m6,
IFNULL((select amount from profit m7 where m7.month="7" and m7.year=m.year),0) as m7,
IFNULL((select amount from profit m8 where m8.month="8" and m8.year=m.year),0) as m8,
IFNULL((select amount from profit m9 where m9.month="9" and m9.year=m.year),0) as m9,
IFNULL((select amount from profit m10 where m10.month="10" and m10.year=m.year),0) as m10,
IFNULL((select amount from profit m11 where m11.month="11" and m11.year=m.year),0) as m11,
IFNULL((select amount from profit m12 where m12.month="12" and m12.year=m.year),0) as m12
from profit m group by m.year
) t2 ) t3

改进版:

select IFNULL(year,"总计") as year,sum(t.total) as 'total' ,sum(t.m1) as '1月',
sum(t.m2) as '2月',
sum(t.m3) as '3月',
sum(t.m4) as '4月',
sum(t.m5) as '5月',
sum(t.m6) as '6月',
sum(t.m7) as '7月',
sum(t.m8) as '8月',
sum(t.m9) as '9月',
sum(t.m10) as '10月',
sum(t.m11) as '11月',
sum(t.m12) as '12月'from
(
select year,sum(amount) as 'total',
IFNULL((select amount from profit m1 where m1.month="1" and m1.year=m.year),0) as m1,
IFNULL((select amount from profit m2 where m2.month="2" and m2.year=m.year),0) as m2,
IFNULL((select amount from profit m3 where m3.month="3" and m3.year=m.year),0) as m3,
IFNULL((select amount from profit m4 where m4.month="4" and m4.year=m.year),0) as m4,
IFNULL((select amount from profit m5 where m5.month="5" and m5.year=m.year),0) as m5,
IFNULL((select amount from profit m6 where m6.month="6" and m6.year=m.year),0) as m6,
IFNULL((select amount from profit m7 where m7.month="7" and m7.year=m.year),0) as m7,
IFNULL((select amount from profit m8 where m8.month="8" and m8.year=m.year),0) as m8,
IFNULL((select amount from profit m9 where m9.month="9" and m9.year=m.year),0) as m9,
IFNULL((select amount from profit m10 where m10.month="10" and m10.year=m.year),0) as m10,
IFNULL((select amount from profit m11 where m11.month="11" and m11.year=m.year),0) as m11,
IFNULL((select amount from profit m12 where m12.month="12" and m12.year=m.year),0) as m12
from profit m group by m.year
) t
group by year with rollup;

【mysql练习】转置,总计,分组的更多相关文章

  1. 如何在MySQL中查询每个分组的前几名【转】

    问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...

  2. 【mybatis】【mysql】mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains no ...

  3. mysql使用GROUP BY分组实现取前N条记录的方法

    MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道 ...

  4. mysql中的过滤分组

    本文节选自<MYSQL必知必会> 一. 过滤分组 除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组.例如,可能想要列出至少有两个订单的所有顾客. ...

  5. 快速回顾MySQL:汇总和分组

    10.3 汇总数据 我们经常需要汇总数据而不用把它们实际检索处出来,为此MySQL提供了专门的函数.使用这些函数,MySQL查询可用于检索数据,以便分析和报表的生成.这种类型的检索例子有以下几种: 确 ...

  6. MySQL之排序、分组(五)

    一.排序 格式:select * from 表 order by 字段 asc|desc 1.查询所有的商品进行排序(升序asc.降序desc) mysql> select * from pro ...

  7. 如何在mysql中查询每个分组的前几名

    问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等.  在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...

  8. MySQL之——GROUP BY分组取字段最大值

    转载自:http://blog.csdn.net/l1028386804/article/details/54657412 假设有一个业务场景,需要查询用户登录记录信息,其中表结构如下: CREATE ...

  9. MySQL数据中分级分组显示数据

    前面已经有了SqlServer数据分级分组显示数据了.今天又来做一个MySQL数据库中的分级分组显示,SqlServer中用到了递归,这里为了简单就直接把根的数据显示为0 ,而不用递归了. 在MySQ ...

  10. 浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7521278.html: 若有错误,请评论指出,谢谢! 1. 聚合函数(Aggregate Function ...

随机推荐

  1. iview、render使用方法

    1.<Table size="large" :columns="columns7" :data="labelInput.label" ...

  2. Windows下安装和使用Masscan

    http://zone.secevery.com/article/1098 0x00 前言Masscan号称最快的互联网端口扫描器,本文来探测一下Masscan在Windows下的安装和使用.mass ...

  3. javase_note

    我上班摸鱼重新学习java基础做的笔记,从面向对象开始 面向对象基础 类与对象 人类.鸟类.鱼类...所谓类,就是对一类事物的描述 对象是某一类事物实际存在的每个个体,因此也称为实例 类是抽象概念,对 ...

  4. 初学银河麒麟linux笔记 第六章 发布qt程序

    本章参考了@长沙红胖子Qt 的笔记 https://blog.51cto.com/hongpangzi/5788384 这里纪录一下步骤 linux上的QT程序已经能正常编译运行,这里需要进行发布. ...

  5. react native 音频播放 react-native-sound

    先放一个效果图:该图实现的效果,点击播放按钮,进度条随着时间移动,点击暂停按钮,进度条停止移动 第一步,用到什么库 1.zmxv/react-native-sound 播放声音的库   2.calls ...

  6. (已解决)MYSQL怎么实现表的id在插入删除的前提下连续递增?

    其实就是用了sql语句. 思路是重置所有id和auto_increment. SET @i=0; UPDATE records SET id=(@i:=@i+1); ALTER TABLE recor ...

  7. Jmeter:随机类函数

    一.__Random 功能介绍:计算范围内的随机数 ${__Random(参数 1,参数 2,参数 3)} 参数 1:开始数字,包括在内 参数 2:结束数字,包括在内 参数 3:注册变量名称  二._ ...

  8. php对接飞书机器人报警接口

    <?php function request_by_curl($remote_server, $post_string) { $ch = curl_init(); curl_setopt($ch ...

  9. 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的互转

    /**火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的互转  * Created by macremote on 16/5/3.  */ function GPSUtil (){   v ...

  10. 【记录】Linux Mint Cinnamon Desktop Enviroment使用记录

    之前使用的系统是Kali Linux,并不是看上了一堆工具,工具的话上虚拟机不好吗,会折腾的docker更好阿,主要是 1. 用习惯了gnome的桌面环境 2. 开箱即用 很多配置他都已经做好了 我都 ...