WITH ROLLUP
官方:http://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html
WITH ROLLUP修饰符会输出另外的汇总行,实现更高级的汇总操作。官网下面继续描述它的好处,此处忽略。
进入exp:
首先创建一张销售表:
CREATE TABLE sales
(
year INT NOT NULL,
country VARCHAR(20) NOT NULL,
product VARCHAR(32) NOT NULL,
profit INT
);
根据年份做一个关于利润的简单汇总:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 | 4525 |
| 2001 | 3010 |
+------+-------------+
上面是根据每年计算的利润,若想计算所有年份的总利润,你必须自己加上每年的利润,或者作另外的查询。这时WITH ROLLUP闪亮登场,它会多输出所有年份的总利润,即提供牛叉的多层次分析(both levels of analysis with a single query):
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 | 4525 |
| 2001 | 3010 |
| NULL | 7535 |
+------+-------------+
上面汇总时,总利润的年份会被置为NULL。
官方最下面有一个用户评论:
改造上面语句,修改NULL为Total,贴过来:
Even though the NULL rows are inserted late in query processing, they seem to be available to the select_expr part of a SELECT statement. Using the example table:
SELECT
IFNULL(year,"Total") as year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP(也可以用
COALESCE(year,"Total")代替IFNULL());
returns:
+-------+-------------+
| year | SUM(profit) |
+-------+-------------+
| 2000 | 4525 |
| 2001 | 3010 |
| Total | 7535 |
+-------+-------------+
另外,当GROUP BY多个列时,WITH ROLLUP影响更甚。此时每一列额外都会做一个整体汇总。
exp:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product;
+------+---------+------------+-------------+
| year | country | product | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer | 1500 |
| 2000 | Finland | Phone | 100 |
| 2000 | India | Calculator | 150 |
| 2000 | India | Computer | 1200 |
| 2000 | USA | Calculator | 75 |
| 2000 | USA | Computer | 1500 |
| 2001 | Finland | Phone | 10 |
| 2001 | USA | Calculator | 50 |
| 2001 | USA | Computer | 2700 |
| 2001 | USA | TV | 250 |
+------+---------+------------+-------------+
加上WITH ROLL UP会输出每一年份/国家/产品的一个整体汇总,如下:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+
| year | country | product | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer | 1500 |
| 2000 | Finland | Phone | 100 |
| 2000 | Finland | NULL | 1600 |
| 2000 | India | Calculator | 150 |
| 2000 | India | Computer | 1200 |
| 2000 | India | NULL | 1350 |
| 2000 | USA | Calculator | 75 |
| 2000 | USA | Computer | 1500 |
| 2000 | USA | NULL | 1575 |
| 2000 | NULL | NULL | 4525 |
| 2001 | Finland | Phone | 10 |
| 2001 | Finland | NULL | 10 |
| 2001 | USA | Calculator | 50 |
| 2001 | USA | Computer | 2700 |
| 2001 | USA | TV | 250 |
| 2001 | USA | NULL | 3000 |
| 2001 | NULL | NULL | 3010 |
| NULL | NULL | NULL | 7535 |
+------+---------+------------+-------------+
注意一下置为NULL的列,例如当统计2000年USA的所有产品产生的利润,此时产品置为NULL,其余相似。具体解释官方有。
另外,当我们使用WITH ROLL UP时还需要考虑一些其他问题。
1、不能直接使用ORDER BY排序,两者是相互独立的,不过可以对查询出来的结果集(子查询/中间表)进行排序(注意排序的列名)。
mysql> SELECT * FROM (SELECT year, country, SUM(profit) FROM sales GROUP BY year WITH ROLLUP)
-> derived_t1 ORDER BY year;
2、LIMIT子句放在WITH ROLL UP之后,不过加上这个,会影响WITH ROLL UP的效果:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product WITH ROLLUP
-> LIMIT 5;
+------+---------+------------+-------------+
| year | country | product | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer | 1500 |
| 2000 | Finland | Phone | 100 |
| 2000 | Finland | NULL | 1600 |
| 2000 | India | Calculator | 150 |
| 2000 | India | Computer | 1200 |
+------+---------+------------+-------------+
3、列置NULL的规则:
在查询结果发往客户端时,额外的汇总(列)置为NULL值。服务器着眼于被命名在GROUP BY子句中的那些列中最左边已经改变值的列,如year。如果结果集的显示列与GROUP BY的列名匹配的话(官方原文:For any column in the result set with a name that is a lexical match to any of those names, its value is set toNULL
.),那么它的值会设为NULL。如果用列number来说明grouping列,那么服务器会通过number来辨识哪些列的值设为NULL。(这一段有些不好理解,先这么翻译)
4、由于额外汇总行在结果集的下面(查询比较晚),不能添加HAVING col IN NULL子句筛选(除了额外汇总行之外)某列值为NULL的行,NULL值可以通过mysql客户端函数验证。
筛选额外汇总行例子:
NULL rows are inserted very late in the query process, but they can be used very well as described in the post above. Also they can be used with the HAVING clause.
mysql> SELECT IFNULL(url, 'ALL_URLS') AS url, IFNULL(year, 'ALL_YEARS') AS year, IFNULL(country, 'ALL_COUNTRIES') AS country, SUM(visit) FROM rollup_1 GROUP BY url, year, country WITH ROLLUP HAVING country is null;
+----------------------+-----------+---------------+------------+
| url | year | country | SUM(visit) |
+----------------------+-----------+---------------+------------+
| http://www.yahoo.com | 2005 | ALL_COUNTRIES | 22000 |
| http://www.yahoo.com | 2006 | ALL_COUNTRIES | 26700 |
| http://www.yahoo.com | 2007 | ALL_COUNTRIES | 34200 |
| http://www.yahoo.com | ALL_YEARS | ALL_COUNTRIES | 82900 |
| ALL_URLS | ALL_YEARS | ALL_COUNTRIES | 82900 |
+----------------------+-----------+---------------+------------+
5 rows in set, 4 warnings (0.00 sec)
There is one gotcha, if the column value itself has a NULL value, you may see undefined behavior.
5、允许不在GROUP BY子句的列出现在查询列中:
mysql> SELECT year, country, SUM(profit)
-> FROM sales GROUP BY year WITH ROLLUP;
+------+---------+-------------+
| year | country | SUM(profit) |
+------+---------+-------------+
| 2000 | India | 4525 |
| 2001 | USA | 3010 |
| NULL | USA | 7535 |
+------+---------+-------------+
6、不过当使用了ONLY_FULL_GROUP_BY模式,正规军之后,上面的操作会视为违法,因为上面的country并不在GROUP BY子句。
分享到:
相关推荐
modifiers是方法修饰符的集合,也是制作更多的方法。 显然,方法修饰符会修改方法。 具体来说,在 Ruby 术语中,它们是类方法,它们: 取一个符号参数,它命名同一个类的实例方法,和返回相同的符号,但导致对命名...
在Java编程中,修饰符(Modifiers)扮演着至关重要的角色,它们用于控制类、方法、变量等元素的可见性和行为。Java提供了两种主要类型的修饰符:访问控制修饰符和非访问控制修饰符。本文将深入探讨Java的访问控制...
已弃用JSX的事件修饰符:改为查看https://github.com/vuejs/jsx。此babel插件在JSX中添加了一些语法糖。...[” jsx-event-modifiers“,” transform-vue-jsx“]}事件修饰符示例:export default {render(){return
余烬手势修饰符 提供手势作为修饰符的插件。 兼容性 Ember.js v3.16或更高版本 Ember CLI v2.13或更高版本 Node.js v10或更高版本 安装 ember install ember-gesture-modifiers 用法 当前仅提供“平移”修改器。 ...
在"cocktail-method-modifiers"这个项目中,我们看到的是如何在CocktailJS中使用类似Moose的方法修饰符。 方法修饰符是编程中一种强大的工具,它们允许我们在方法定义之前或之后插入额外的行为,例如验证、缓存或...
@ ember / render-modifiers 提供元素修饰符,可用于挂钩到渲染生命周期的特定部分。何时使用这些修饰符(何时不使用它们) 此软件包中提供的修饰符非常适合快速从经典的Ember组件迁移到Glimmer组件,因为它们很大...
4. **权限修饰符(Access Modifiers)**: Java有四种权限修饰符:public、protected、default(无修饰符)和private。public类和成员可以在任何地方访问,protected成员在同一包内和子类中可见,default成员仅在...
qlik-修饰符 一个用于处理Qlik产品中的表达式修饰符JavaScript模块。 !实验! 这个想法是提供一组有用的表达式修饰符以及使用它们的便捷方法。 首先是accumulation ,它可以产生类似于以下结果: 它是如何工作的?...
用于创建modifiers.json词典的脚本,以方便修饰符。 用法 编辑make-modifiers.py文件,然后将所需的键添加到hotkeys变量中。 例如,将["KH-FG", "grave"],到hotkeys数组中,以创建⌘ `切换窗口的快捷方式。 另请...
修饰符(Modifiers)是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。这篇文章给大家介绍Vue.js中.native修饰符,感兴趣的朋友一起看看吧。 .native修饰符 官方对.native修饰符的解释为: 有...
本教程将聚焦于“QT拖放事件之五:自定义拖放操作-拖动中的修饰符操作”,探讨如何利用键盘修饰键(如Ctrl、Shift等)来扩展和定制拖放行为,以实现更复杂的交互。 首先,理解QT中的拖放机制。在QT中,拖放操作通常...
高级修饰符 扩展了您可以在 Exp:resso 的商店模块中定义价格修饰符的方式。 执照 麻省理工学院许可证 (MIT) 版权所有 (c) 2014 Jeremy Worboys 特此授予任何人免费获得本软件副本和相关文档文件(“软件”)的许可...
余烬修饰符 该插件提供了一个在Ember中创作的API。 它反映了Ember的API,并具有编写简单的功能修饰符和编写更复杂的类修饰符的变体。 此插件是和的下一个迭代。 对API进行了一些重大更改。 有关差异的列表,请参见...
6. **修饰符(Access Modifiers)**: Java有四种访问修饰符:`public`、`protected`、`private`和默认(无修饰符)。`public`表示全局可见,`protected`限制在同包和子类中可见,`private`仅限于同一类内,而默认...
草稿js修饰符 模块化状态修饰符yarn add draft-js-modifiers# ornpm i draft-js-modifiers用法 import * as Modifiers from 'draft-js-modifiers'const newEditorState = Modifiers . mergeBlockData ( ...
余烬滚动修饰符 基于Scoll的Ember应用修饰符查看! 我们遵守《行为的《 》。兼容性Ember.js v3.8或以上Ember CLI v2.13或更高版本Node.js v10或更高版本安装ember install ember-scroll-modifiers贡献有关详细信息,...
Java Class and Method Modifiers
- 介绍:`public`修饰符使得类、接口或成员对所有其他类可见,无论它们是否位于同一包内。这意味着,只要拥有相应的引用,任何类都可以访问被`public`修饰的元素。 2. **private**: - 使用对象:成员 - 介绍:`...
CSS-Components-Modifiers-And-Subcomponents-Collection, 通用CSS模块类名称的集合 CSS组件,修饰符和子组件集合web组件的公共CSS组件。修饰符和子组件类名称的集合。什么是CSS组件,修饰符和子组件?最近我一直在...
撰写修饰符操场 Compose Modifiers Playground IDEA插件的源代码 通过此交互式游乐场了解如何使用Jetpack Compose修改器! 可用的修饰符: 背景 边境 夹子 FillMaxHeight FillMaxSize FillMaxWidth 抵消 填充 ...