with rollup函数做合计以及行转列
MySQL-with rollup函数运用 _20160930
在博客里http://www.cnblogs.com/Mr-Cxy/p/5898839.html提到了行转列,(http://blog.csdn.net/ybygjy/article/details/41557425)行转列 列转行都有
如果想在下面这个表下面添加一行 总计 数据行SQL代码怎么实现 并且根据9月金额进行城市降序 总计置于底部呢
MySQL提供了 group by with rollup 函数进行group by 字段的汇总
但是order by 互斥的不能同时用
第一步还是是先计算各城市每个月的金额
SELECT b.城市,SUM(IF(b.年月=201607,b.金额,NULL)) AS 7月金额,SUM(IF(b.年月=201608,b.金额,NULL)) AS 8月金额,SUM(IF(b.年月=201609,b.金额,NULL)) AS 9月金额 FROM (SELECT city AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金额FROM test_a03order AS aGROUP BY city,DATE_FORMAT(order_time,"%Y%m") ) AS b GROUP BY b.城市
第二步我们先用group by with rollup 函数添加针对字段的汇总
SELECT b.城市,SUM(IF(b.年月=201607,b.金额,NULL)) AS 7月金额,SUM(IF(b.年月=201608,b.金额,NULL)) AS 8月金额,SUM(IF(b.年月=201609,b.金额,NULL)) AS 9月金额 FROM (SELECT city AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金额FROM test_a03order AS aGROUP BY city,DATE_FORMAT(order_time,"%Y%m") ) AS b GROUP BY b.城市 WITH ROLLUP
这个记录没有出现总计两个字,怎么实现呢 继续修改代码 ifnull()函数
第三 添加总计字样(有坑) ifnull()函数是将空字段另外命名
SELECT IFNULL(b.城市,"总计") AS 城市,SUM(IF(b.年月=201607,b.金额,NULL)) AS 7月金额,SUM(IF(b.年月=201608,b.金额,NULL)) AS 8月金额,SUM(IF(b.年月=201609,b.金额,NULL)) AS 9月金额 FROM (SELECT city AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金额FROM test_a03order AS aGROUP BY city,DATE_FORMAT(order_time,"%Y%m") ) AS b GROUP BY b.城市 WITH ROLLUP
第四 摆脱掉坑
为什么说有坑呢 如果ifnull()函数放在上面代码位置 看似实现了总计的字样 ifnull()是针对用了with rollup 函数总计这个位置出现空字段时候修改它为总计字样的,
如果城市这一列里本身就含有没有命名的城市呢 这一列就会出现多个总计字样 因此我们需要将ifnull()函数放到嵌套的子表里 将空字段在子表里面就预先改成别名(不能是总计字样)
因此 使用2个ifnull()函数就不会有这样的问题 结果是一样的
SELECT IFNULL(b.城市,"总计") AS 城市,SUM(IF(b.年月=201607,b.金额,NULL)) AS 7月金额,SUM(IF(b.年月=201608,b.金额,NULL)) AS 8月金额,SUM(IF(b.年月=201609,b.金额,NULL)) AS 9月金额 FROM (SELECT IFNULL(city,'空城市') AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金额FROM test_a03order AS aGROUP BY city,DATE_FORMAT(order_time,"%Y%m") ) AS b GROUP BY b.城市 WITH ROLLUP
第五 排序
在这篇博客http://www.cnblogs.com/Mr-Cxy/p/5910291.html 提到了order by field()自定义排序函数 如下图红框所示有这样一个默认的自定义排序规则
因此 如果想实现 根据9月金额进行城市降序 总计置于底部 效果 可以把上面代码当成一个子表嵌套 结合 order by field()自定义函数实现
SELECT c.* FROM (SELECT IFNULL(b.城市,"总计") AS 城市,SUM(IF(b.年月=201607,b.金额,NULL)) AS 7月金额,SUM(IF(b.年月=201608,b.金额,NULL)) AS 8月金额,SUM(IF(b.年月=201609,b.金额,NULL)) AS 9月金额FROM (SELECT IFNULL(city,'空城市') AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金额FROM test_a03order AS aGROUP BY city,DATE_FORMAT(order_time,"%Y%m")) AS bGROUP BY b.城市 WITH ROLLUP ) AS c ORDER BY FIELD(城市,'总计'),c.9月金额 DESC
with rollup函数做合计以及行转列相关推荐
- 用oracle的rollup函数进行合计操作
需求: 用oracle的rollup函数进行合计操作 公式: select decode(a,null,'合计',a) ,b,sum(c) c from t group by rollup((a,b, ...
- element table 合计 第一行 固定列
element table 合计 第一行 在这位大哥这里学来的, 但同时我这边的情况是: 固定高度, 第一列固定, 参数多, 因此, 这个方法不能够完全满足, 因此加入以下代码: 代码作用: 在每次获 ...
- oracle pivot函数 后求和,Oracle行转列,pivot函数和unpivot函数
pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)): unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 fo ...
- 使用函数PIVOT现实数据行转列
表数据库如下图所示: 要求按Course分类值,用列表示,同进要求查询结果如下图表示. SELECT stu_Name, SUM([Mathematics]) as Mathematics, SUM( ...
- pivot sqlserver 条件_SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行
PIVOT函数,行转列 PIVOT函数的格式如下 PIVOT(([聚合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转 ...
- mysql行转列和列转行_Mysql中行转列和列转行
一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id IN ...
- mysql 行转列 列转行
一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_score(id INT( ...
- mysql 列转行union all_mysql的 行转列(7种方法) 和 列转行
# 一.行转列 # 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( i ...
- 【精】mysql行转列的7种方法及列转行
文章目录 一.行转列 1.使用case-when-then 进行行转列 2.使用IF() 进行行转列: 3.利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用 IFNULL ...
- 搞定mysql的 行转列(7种方法) 和 列转行
目录 一.行转列 1.使用case-when-then 2.使用SUM(IF()) 生成列 3.使用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行 4.使用SUM(IF()) 生 ...
最新文章
- 【响应式Web前端设计】H5原生表单验证
- java通过使用ffmpeg获取视频的码率
- 【读书笔记】iOS-NSString的length
- c语言如何设置c99标准,新的C语言: C99标准介绍
- resizable 回调函数参数详解
- python做图像识别该学什么_Python实现图片识别加翻译【高薪必学】
- 百度百科做起来也不难
- 从编写到上线带你搞定springboot博客01
- zabbix agent报错 :cannot connect to [[127.0.0.1]:10051]: [111] Connection refused
- Spring Boot核心注解讲解
- 微信JSAPI模式与浏览器类型安全访问
- Linux下maven安装
- Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换
- 常见机器人离线编程软件对比
- 微信群二维码有效期如何延长?突破7天有效期的方法!
- 恭主驾到:最新的汽车年审新规,都了解了吗?
- wlan协议—802.11n—802.11ac 5G和2.4G
- Flex to Excel or Excel to Flex
- 通过网页控制嵌入式设备
- 面试攻略!Java 基础面试 100 问