【mysql练习】转置,总计,分组
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练习】转置,总计,分组的更多相关文章
- 如何在MySQL中查询每个分组的前几名【转】
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...
- 【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 ...
- mysql使用GROUP BY分组实现取前N条记录的方法
MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道 ...
- mysql中的过滤分组
本文节选自<MYSQL必知必会> 一. 过滤分组 除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组.例如,可能想要列出至少有两个订单的所有顾客. ...
- 快速回顾MySQL:汇总和分组
10.3 汇总数据 我们经常需要汇总数据而不用把它们实际检索处出来,为此MySQL提供了专门的函数.使用这些函数,MySQL查询可用于检索数据,以便分析和报表的生成.这种类型的检索例子有以下几种: 确 ...
- MySQL之排序、分组(五)
一.排序 格式:select * from 表 order by 字段 asc|desc 1.查询所有的商品进行排序(升序asc.降序desc) mysql> select * from pro ...
- 如何在mysql中查询每个分组的前几名
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...
- MySQL之——GROUP BY分组取字段最大值
转载自:http://blog.csdn.net/l1028386804/article/details/54657412 假设有一个业务场景,需要查询用户登录记录信息,其中表结构如下: CREATE ...
- MySQL数据中分级分组显示数据
前面已经有了SqlServer数据分级分组显示数据了.今天又来做一个MySQL数据库中的分级分组显示,SqlServer中用到了递归,这里为了简单就直接把根的数据显示为0 ,而不用递归了. 在MySQ ...
- 浅析MySQL使用 GROUP BY 分组聚合与细分聚合
原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7521278.html: 若有错误,请评论指出,谢谢! 1. 聚合函数(Aggregate Function ...
随机推荐
- EL表达式读取属性不存在的异常,读取类的属性不存在,无法调用到该属性
修改类中的名称,必须要符合2JavaBaen要求,否则EL表达式读取不到.
- application.yaml
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: j ...
- react native 布局问题
1. Text组件里面的 文字垂直居中 <Text style={styles.confirmButtonStyle}>确认</Text> confirmButtonStyle ...
- 苹果ios APP怎么打包?推荐这个网站
众所周知,苹果的应用开发需要基于苹果电脑环境,而我们很多开发者并不具备这样的条件.如果你买一台贵的苹果电脑只是为了发布一个应用,成本太高了! 就算你有苹果电脑,你也可以自己开发一个基于web的IOS应 ...
- (四)用go实现红黑树
本篇文章我们用go来实现红黑树,部分参考资料如下: https://www.cnblogs.com/skywang12345/p/3245399.html#!comments https://blog ...
- Linux df -h 显示磁盘空间满,但实际未占用满——问题分析
问题现象: 遇到一个问题,在系统上,告警提示磁盘空间不够,如下图所示: 问题分析: 1.首先使用 :du -h / --max-depth=1 命令查看各个目录的占用空间,试图找到占用较多空间的目 ...
- 【ubuntu20】设置静态IP
sudo gedit /etc/netplan/01-network-manager-all.yaml 修改文件为: # Let NetworkManager manage all devices o ...
- mariadb 集群 重启的几种情形
最近项目中遇到过一次mariadb集群中三台节点有两台挂掉的情况.总结了一下mariadb集群可能遇到的几种情况需要重启. 环境说明: mariadb集群ip: 10.0.101.51 10.0.10 ...
- (0416) python正则 RE 【用python处理sv源文件-格式化代码】
https://zhuanlan.zhihu.com/p/144069088
- python 中的lamda 表达式
#1. print(list(filter(lambda x: x%2,range(10)))) #[1, 3, 5, 7, 9]# 非lamda表示def odd(x): return x ...