如果想在下面这个表下面添加一行 总计 数据行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 a

GROUP 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 a

GROUP 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 a

GROUP 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 a

GROUP 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 a

GROUP BY city,DATE_FORMAT(order_time,"%Y%m")

) AS b

GROUP BY b.城市 WITH ROLLUP

) AS c

ORDER BY FIELD(城市,'总计'),c.9月金额 DESC

mysql有rollup函数吗_MySQL-with rollup函数运用相关推荐

  1. mysql的字符串函数大全_MySQL的字符串函数大全

    ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql> select ASCII('2'); -& ...

  2. mysql时间函数now()_MySQL中时间函数NOW()和SYSDATE()的区别

    mysql中日期函数还是比较常用的.主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别. NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间. ...

  3. mysql相隔多长时间_Mysql 计算时间间隔函数

    mysql计算时间差函数 MySql计算两个日期的时间差函数TIMESTAMPDIFF用法,只要用一句SQL语句就可以办到了. MySql计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法 ...

  4. mysql group语句可以排序_MySQL中group_concat()函数的排序方法

    示例一 group_concat()函数的参数是可以直接使用order by排序,下面通过例子来说明,首先看下面的t1表. 比如,我们要查看每个人的多个分数,将该人对应的多个分数显示在一起,分数要从高 ...

  5. mysql数据库对时间的函数吗_mysql 数据库 时间函数

    取得当天: SELECT curdate(); mysql> SELECT curdate(); +------------+ | curdate() | +------------+ | 20 ...

  6. mysql concat键值对_MySQL中concat函数

    一. concat()函数 1. 含义: 将多个字符串连接成一个字符串. 2. 语法: concat(str1, str2,...) 返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返 ...

  7. mysql里concat什么意思_mysql里concat函数和 ‘’|‘’ 符号一起用是表示什么?

    比如像这种:concat(t4.name,t4.pinyin,t1.trader)|t4.name concat为mysql拼接函数. "|"表示按位或.按位或运算时,数据库系统会 ...

  8. mysql 函数 局部变量_MySQL 存储过程 存储函数 局部变量 游标 概念示例

    一个存储过程是一个可编程的函数,它可以在MySQL中创建并保存.它是由一些SQL语句和一些特殊的控制结构语句组成. 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定的功能时,存储过程是一个非 ...

  9. mysql uuid_short 为什么不存在_MySQL内置函数uuid和uuid_short

    有同学问到MySQL的uuid这个函数.简要介绍一下. 用法 简单看到,这个值,每次执行都是不同的. 生成规则 第1 2 3 段是与时间有关的. time_low.time_mid.time_high ...

  10. mysql时间函数总结_MySQL 日期时间函数常用总结

    获得当前日期+时间(date + time)1.1    函数:now() 相关函数:current_timestamp(),localtime(),localtimestamp() 举例说明: 2. ...

最新文章

  1. Python 笔试面试合集
  2. 模式6--ReadWriteLock
  3. 【青少年编程(第31周)】一个有趣又有料的抖音号!
  4. JavaScript DOM编程艺术学习笔记(一)
  5. 【Java】Java反射调用可变参数的方法
  6. 从零开始学习Sencha Touch MVC应用之十四
  7. yolov5模型框架详解
  8. uniapp编译成小程序代码过大的处理方法
  9. php旧物交易开源代码_PHP学习笔记:php二手交易市场系统
  10. 基于OpenCV与MFC的人脸识别
  11. chrome哪个版本最好用_我拥有哪个版本的Chrome?
  12. 1999-2018年地级市经济增长数据(GDP、人均GDP、各产业产值占比等)
  13. 暑期作息时间表模板_2015中学生暑假作息时间表模板
  14. h264视频与pcm音频合成MP4视频格式
  15. AI智能视频分析系统提升水泥厂安全监管解决方案
  16. 强柱的治疗目标_24周疗效预测因素
  17. Skia深入分析6——skia中图像编解码代码概述
  18. 百度地图API基础操作--百度鹰眼篇
  19. 从0到1,搭建离线下载器
  20. am335x+wm8960音频基于linux 4.9.41移植

热门文章

  1. 360浏览器cookie的导出
  2. Win7扫雷的H5完整复刻实现(一) / js扫雷算法的初次鉴定与地图初始化实现
  3. Reeder Web版
  4. 计算机毕业设计的读书笔记,毕业设计之读书笔记
  5. 大数据面试题及答案-汇总版
  6. 20 杭电计算机考研经验
  7. 关于华为宣讲的一些感悟
  8. SpringBoot学习_创建
  9. java epoll 模型_I/O多路复用技术详解之epoll模型
  10. IDEA导入项目不显示项目结构src解决