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函数做合计以及行转列相关推荐

  1. 用oracle的rollup函数进行合计操作

    需求: 用oracle的rollup函数进行合计操作 公式: select decode(a,null,'合计',a) ,b,sum(c) c from t group by rollup((a,b, ...

  2. element table 合计 第一行 固定列

    element table 合计 第一行 在这位大哥这里学来的, 但同时我这边的情况是: 固定高度, 第一列固定, 参数多, 因此, 这个方法不能够完全满足, 因此加入以下代码: 代码作用: 在每次获 ...

  3. oracle pivot函数 后求和,Oracle行转列,pivot函数和unpivot函数

    pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)): unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 fo ...

  4. 使用函数PIVOT现实数据行转列

    表数据库如下图所示: 要求按Course分类值,用列表示,同进要求查询结果如下图表示. SELECT stu_Name, SUM([Mathematics]) as Mathematics, SUM( ...

  5. pivot sqlserver 条件_SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

    PIVOT函数,行转列 PIVOT函数的格式如下 PIVOT(([聚合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转 ...

  6. mysql行转列和列转行_Mysql中行转列和列转行

    一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id IN ...

  7. mysql 行转列 列转行

    一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_score(id INT( ...

  8. mysql 列转行union all_mysql的 行转列(7种方法) 和 列转行

    # 一.行转列 # 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( i ...

  9. 【精】mysql行转列的7种方法及列转行

    文章目录 一.行转列 1.使用case-when-then 进行行转列 2.使用IF() 进行行转列: 3.利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用 IFNULL ...

  10. 搞定mysql的 行转列(7种方法) 和 列转行

    目录 一.行转列 1.使用case-when-then  2.使用SUM(IF()) 生成列 3.使用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行 4.使用SUM(IF()) 生 ...

最新文章

  1. 【响应式Web前端设计】H5原生表单验证
  2. java通过使用ffmpeg获取视频的码率
  3. 【读书笔记】iOS-NSString的length
  4. c语言如何设置c99标准,新的C语言: C99标准介绍
  5. resizable 回调函数参数详解
  6. python做图像识别该学什么_Python实现图片识别加翻译【高薪必学】
  7. 百度百科做起来也不难
  8. 从编写到上线带你搞定springboot博客01
  9. zabbix agent报错 :cannot connect to [[127.0.0.1]:10051]: [111] Connection refused
  10. Spring Boot核心注解讲解
  11. 微信JSAPI模式与浏览器类型安全访问
  12. Linux下maven安装
  13. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换
  14. 常见机器人离线编程软件对比
  15. 微信群二维码有效期如何延长?突破7天有效期的方法!
  16. 恭主驾到:最新的汽车年审新规,都了解了吗?
  17. wlan协议—802.11n—802.11ac 5G和2.4G
  18. Flex to Excel or Excel to Flex
  19. 通过网页控制嵌入式设备
  20. 面试攻略!Java 基础面试 100 问

热门文章

  1. iOS 视频播放器开发(一)
  2. MobTech城市智图 | 如何进行商场客群和竞品客群分析?
  3. Jmeter数据库连接(MYSQL)
  4. 前言:电商产品经理必修课-如何打造实战型商品系统
  5. 3DMAX哪个版本最稳定?3DMAX哪个版本最好用?
  6. 小觅相机SDK安装与报错解决
  7. 马哥python全栈培训怎么样,你只需要在马哥教育待四个月
  8. 华为薪酬体系的整体框架
  9. 微信小程序中播放视频 例子
  10. 第 10 章 Python 第三方库使用