• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > mysql和oracle的group by的rollup和cube

mysql和oracle的group by的rollup和cube

作者:娜然的专栏 字体:[增加 减小] 来源:互联网 时间:2017-08-28

娜然的专栏通过本文主要向大家介绍了mysql等相关知识,希望本文的分享对您有所帮助

mysql中需要注意两点:

(1)rollup和order by互斥
root@localhost:gw1 04:23:17> select year(orderdate) as year,sum(qty) as sum from t group by year(orderdate) with rollup order by year;
ERROR 1221 (HY000): Incorrect usage of CUBE/ROLLUP and ORDER BY

(2)如果分组的列包含null值,那么rollup的结果可能是不正确的,因为在rollup中进行分组统计时值null具有特殊的意义。

(3)mysql(5.6)只支持rollup,不支持cube


下面先看mysql的rollup操作:
select year(orderdate) as year,sum(qty) as sum from t group by year(orderdate) with rollup;
+------+------+
| year | sum  |
+------+------+
| 2009 |   30 |
| 2010 |  100 |
| 2011 |   90 |
| NULL |  220 |
+------+------+
4 rows in set (0.00 sec)

select empid,custid,year(orderdate) year,sum(qty) sum
from t
group by empid,custid,year(orderdate) with rollup;
+-------+--------+------+------+
| empid | custid | year | sum  |
+-------+--------+------+------+
|     1 | a      | 2010 |   30 |
|     1 | a      | NULL |   30 |
|     1 | c      | 2011 |   40 |
|     1 | c      | NULL |   40 |
|     1 | NULL   | NULL |   70 |
|     2 | a      | 2009 |   10 |
|     2 | a      | NULL |   10 |
|     2 | b      | 2010 |   20 |
|     2 | b      | NULL |   20 |
|     2 | NULL   | NULL |   30 |
|     3 | a      | 2010 |   10 |
|     3 | a      | NULL |   10 |
|     3 | b      | 2009 |   20 |
|     3 | b      | 2011 |   30 |
|     3 | b      | NULL |   50 |
|     3 | d      | 2010 |   40 |
|     3 | d      | NULL |   40 |
|     3 | NULL   | NULL |  100 |
|     4 | a      | 2011 |   20 |
|     4 | a      | NULL |   20 |
|     4 | NULL   | NULL |   20 |
|  NULL | NULL   | NULL |  220 |
+-------+--------+------+------+
22 rows in set (0.00 sec)


cube:mysql定义了cube关键字,但是不支持cube操作。

select empid,custid,year(orderdate),sum(qty) from t group by empid,custid,year(orderdate) with cube;
ERROR 1235 (42000): This version of MySQL doesn't yet support 'CUBE'

可以用rullup来模拟cube:(参考了大神姜承尧的文章)
select empid,custid,year(orderdate),sum(qty) from t group by empid,custid,year(orderdate) with rollup
union
select empid,custid,year(orderdate),sum(qty) from t group by empid,year(orderdate),custid with rollup
union
select empid,custid,year(orderdate),sum(qty) from t group by custid,year(orderdate),empid with rollup
union
select empid,custid,year(orderdate),sum(qty) from t group by custid,empid,year(orderdate) with rollup
union
select empid,custid,year(orderdate),sum(qty) from t group by year(orderdate),empid,custid with rollup
union
select empid,custid,year(orderdate),sum(qty) from t group by year(orderdate),custid,empid with rollup;

+-------+--------+-----------------+----------+
| empid | custid | year(orderdate) | sum(qty) |
+-------+--------+-----------------+----------+
|     1 | a      |            2010 |       30 |
|     1 | a      |            NULL |       30 |
|     1 | c      |            2011 |       40 |
|     1 | c      |            NULL |       40 |
|     1 | NULL   |            NULL |       70 |
|     2 | a      |            2009 |       10 |
|     2 | a      |            NULL |       10 |
|     2 | b      |            2010 |       20 |
|     2 | b      |            NULL |       20 |
|     2 | NULL   |            NULL |       30 |
|     3 | a      |            2010 |       10 |
|     3 | a      |            NULL |       10 |
|     3 | b      |            2009 |       20 |
|     3 | b      |            2011 |       30 |
|     3 | b      |            NULL |       50 |
|     3 | d      |            2010 |       40 |
|     3 | d      |            NULL |       40 |
|     3 | NULL   |            NULL |      100 |
|     4 | a      |            2011 |       20 |
|     4 | a      |            NULL |       20 |
|     4 | NULL   |            NULL |       20 |
|  NULL | NULL   |            NULL |      220 |
|     1 | NULL   |            2010 |       30 |
|     1 | NULL   |            2011 |       40 |
|     2 | NULL   |            2009 |       10 |
|     2 | NULL   |            2010 |       20 |
|     3 | NULL   |            2009 |       20 |
|     3 | NULL   |            2010 |       50 |
|     3 | NULL   |            2011 |       30 |
|     4 | NULL   |            2011 |       20 |
|  NULL | a      |            2009 |       10 |
|  NULL | a      |            2010 |       40 |
|  NULL | a      |            2011 |       20 |
|  NULL | a      |            NULL |       70 |
|

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2018-12-05mysql-5.7.12解压版安装步骤教程
  • 2018-12-05MySQL安全性指南 (1)(转)
  • 2018-12-05Mysql数据库服务器安装与配置教程
  • 2018-12-05MySQL 存储过程带in和out参数以及PHP,PB如何调用的小例子
  • 2018-12-05mysql进阶(十六)常见问题汇总
  • 2017-05-11MySQL: mysql is not running but lock exists 的解决方法
  • 2018-12-05MySQL数据库-约束与分页
  • 2017-05-11mysql中的保留字段产生的问题
  • 2018-12-05写mongodb日志
  • 2018-12-05实例学习SQL的Select命令

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • linux下perl操作mysql数据库(需要安装DBI)
    • mysql进阶(十七)Cannot Connect to Database Server
    • 详细介绍linux下mysql创建新的用户的方法
    • SQLServe 重复行删除方法
    • MySQL5.6的10053,CBO如何选择执行计划
    • MySQL的重装问题解决方法
    • Mysql的语句生成后门木马的方法
    • mysqlsla慢查询分析工具使用笔记
    • 自动备份mssql server数据库并压缩的批处理脚本
    • 关于学生信息管理系统的知识点

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有