按汇总分组/多维数据集

时不时地,您会遇到一个使您达到SQL限制的要求。 我们中的许多人可能会提早放弃并使用Java / [或您的语言]计算内容。 相反,使用SQL可能是如此简单快捷。 如果您使用的是高级数据库,例如DB2 , Oracle , SQL Server , Sybase SQL Anywhere (以及本例中的MySQL ,它们支持WITH ROLLUP子句),则可以利用ROLLUP / CUBE / GROUPING SETS分组功能。

让我们看一下我的虚构薪水与虚构的朋友相比,后者选择了不同的职业道路(观察2011年的薪水增长情况):

select 'Lukas'      as employee, 'SoftSkills' as company, 80000        as salary, 2007         as year from dualunion all select 'Lukas', 'SoftSkills', 80000,  2008 from dualunion all select 'Lukas', 'SmartSoft',  90000,  2009 from dualunion all select 'Lukas', 'SmartSoft',  95000,  2010 from dualunion all select 'Lukas', 'jOOQ',       200000, 2011 from dualunion all select 'Lukas', 'jOOQ',       250000, 2012 from dualunion all select 'Tom',   'SoftSkills', 89000,  2007 from dualunion all select 'Tom',   'SoftSkills', 90000,  2008 from dualunion all select 'Tom',   'SoftSkills', 91000,  2009 from dualunion all select 'Tom',   'SmartSoft',  92000,  2010 from dualunion all select 'Tom',   'SmartSoft',  93000,  2011 from dualunion all select 'Tom',   'SmartSoft',  94000,  2012 from dual

现在,我们习惯于使用简单的分组和简单的聚合函数来收集统计信息。 例如,让我们计算一下卢卡斯和汤姆在过去几年中的平均收入:

with data as ([above select])select employee, avg(salary)from datagroup by employee

这将表明Lukas赚了更多:

+--------+-----------+
|EMPLOYEE|AVG(SALARY)|
+--------+-----------+
|Lukas   |     132500|
|Tom     |      91500|
+--------+-----------+

因此,找出他们在哪家公司的平均收入可能很有趣:

with data as (...)select company, employee, avg(salary)from datagroup by company, employeeorder by company, employee

随即,很明显,大笔钱在哪里,汤姆做出了一个错误的决定。 ;-)

+----------+--------+-----------+
|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----------+--------+-----------+
|jOOQ      |Lukas   |     225000|
|SmartSoft |Lukas   |      92500|
|SmartSoft |Tom     |      93000|
|SoftSkills|Lukas   |      80000|
|SoftSkills|Tom     |      90000|
+----------+--------+-----------+

卷起

通过添加分组字段,我们“丢失”了一些聚合信息。 在以上示例中,不再直接从结果中获得每位员工的总体平均工资。 考虑到分组算法,这很明显。 但是在美观的报告中,我们通常也希望显示这些分组标题。 这是ROLLUP,CUBE(和GROUPING SETS)起作用的地方。 考虑以下查询:

with data as (...)select company, employee, avg(salary)from datagroup by rollup(company), employee

上面的汇总功能现在将向分组结果集中添加其他行,并保留有用的汇总值。 在这种情况下,当我们“汇总公司的薪水”时,我们将获得剩余分组字段的平均值,即每位员工的平均值:

+----------+--------+-----------+
|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----------+--------+-----------+
|SmartSoft |Tom     |      93000|
|SoftSkills|Tom     |      90000|
|{null}    |Tom     |      91500|
|jOOQ      |Lukas   |     225000|
|SmartSoft |Lukas   |      92500|
|SoftSkills|Lukas   |      80000|
|{null}    |Lukas   |     132500|
+----------+--------+-----------+

请注意,这些行与第一个查询(第一个查询仅由员工分组)所保存的信息相同。当我们将更多分组字段放入汇总功能时,这将变得更加有趣:

with data as (...)select company, employee, avg(salary)from datagroup by rollup(employee, company)

如您所见,分组字段的顺序在汇总功能中很重要。 现在,此查询的结果还将添加支付给所有公司中所有员工的总体平均工资

+----------+--------+-----------+
|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----------+--------+-----------+
|SmartSoft |Tom     |      93000|
|SoftSkills|Tom     |      90000|
|{null}    |Tom     |      91500|
|jOOQ      |Lukas   |     225000|
|SmartSoft |Lukas   |      92500|
|SoftSkills|Lukas   |      80000|
|{null}    |Lukas   |     132500|
|{null}    |{null}  |     112000|
+----------+--------+-----------+

为了标识要报告的总计行,可以在DB2,Oracle,SQL Server和Sybase SQL Anywhere中使用GROUPING()函数。 在Oracle和SQL Server中,还有更有用的GROUPING_ID()函数:

with data as (...)select grouping_id(employee, company) id, company, employee, avg(salary)from datagroup by rollup(employee, company)

它记录了当前行产生在汇总功能的哪个“分组级别”上:

+----+----------+--------+-----------+
|  ID|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----+----------+--------+-----------+
|   0|SmartSoft |Tom     |      93000|
|   0|SoftSkills|Tom     |      90000|
|   1|{null}    |Tom     |      91500|
|   0|jOOQ      |Lukas   |     225000|
|   0|SmartSoft |Lukas   |      92500|
|   0|SoftSkills|Lukas   |      80000|
|   1|{null}    |Lukas   |     132500|
|   3|{null}    |{null}  |     112000|
+----+----------+--------+-----------+

立方体

多维数据集功能的工作原理类似,但多维数据集分组字段的顺序变得无关紧要,因为所有分组组合都已合并。 说起来有点棘手,所以让它付诸实践:

with data as (...)select grouping_id(employee, company) id, company, employee, avg(salary)from datagroup by cube(employee, company)

在以下结果中,您将获得:

  • GROUPING_ID()= 0:每个公司和每个员工的平均值。 这是正常的分组结果
  • GROUPING_ID()= 1:每位员工的平均值
  • GROUPING_ID()= 2:每个公司的平均值
  • GROUPING_ID()= 3:总体平均
+----+----------+--------+-----------+
|  ID|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----+----------+--------+-----------+
|   3|{null}    |{null}  |     112000|
|   2|jOOQ      |{null}  |     225000|
|   2|SmartSoft |{null}  |      92800|
|   2|SoftSkills|{null}  |      86000|
|   1|{null}    |Tom     |      91500|
|   0|SmartSoft |Tom     |      93000|
|   0|SoftSkills|Tom     |      90000|
|   1|{null}    |Lukas   |     132500|
|   0|jOOQ      |Lukas   |     225000|
|   0|SmartSoft |Lukas   |      92500|
|   0|SoftSkills|Lukas   |      80000|
+----+----------+--------+-----------+

换句话说,使用CUBE()函数,您将获得提供给CUBE()函数的分组字段的每种可能组合的分组结果,这将为n个“立方”分组字段产生2 ^ n GROUPING_ID()

jOOQ中的支持

jOOQ 2.0引入了对这些功能的支持。 如果要将最后一个选择转换为jOOQ,则可以大致得到以下Java代码:

// assuming that DATA is an actual table...create.select(groupingId(DATA.EMPLOYEE, DATA.COMPANY).as("id"),DATA.COMPANY, DATA.EMPLOYEE, avg(SALARY)).from(DATA).groupBy(cube(DATA.EMPLOYEE, DATA.COMPANY));

有了这个功能强大的工具,您就可以准备好所有这些精美的报告和数据概述。 有关更多详细信息,请在SQL Server文档页面上继续阅读有关ROLLUP(),CUBE()和GROUPING SETS()函数的内容,其中对此进行了很好的解释:
http://msdn.microsoft.com/en-us/library/bb522495.aspx

参考:来自JAVA,SQL和JOOQ博客的JCG合作伙伴 Lukas Eder的GROUP BY ROLLUP / CUBE 。

相关文章 :

  • Java中的数据库架构导航
  • ORM问题
  • SQL或NOSQL:这是问题吗?
  • 什么是NoSQL?

翻译自: https://www.javacodegeeks.com/2011/12/group-by-rollup-cube.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows和linux双系统——修改默认启动顺序

电脑上装了Windows 7和Ubantu双系统,由于Linux系统用的次数比较少并且还是默认的启动项对此很不能容忍,因此得修改Windows为默认的启动项。 由于电脑上的系统引导程序是GRUB,因此修改当然也就落到Linux系统上啦。 修改/boot/grub/grub.cfg该文…

调试JVM

在某些(极少数)情况下,您可能会遇到使JVM本身崩溃的情况。 我最近通过将ThreadGroup的名称设置为null来进行管理 。 在这些情况下,调试JVM本身很有用,这样可以更精确地定位崩溃。 这是完成此操作的步骤(它们…

ActiveMQ已准备好黄金时段

ActiveMQ项目始于2005年-在很大程度上,它一直是Apache Software Foundation的顶级项目。 ActiveMQ项目的目的一直是提供世界一流的企业消息传递解决方案,其中经纪人能够提供从支持IP的智能设备一直到企业后端的高可用性的连通性。 ActiveMQ提供跨语言客户…

r语言 adf检验_r语言中如何进行两组独立样本秩和检验

r语言中如何进行两组独立样本秩和检验​tecdat.cn安装所需的包wants <- c("coin") has <- wants %in% rownames(installed.packages()) if(any(!has)) install.packages(wants[!has])>一个样本测试set.seed(123) medH0 <- 30 DV <- sample(0:100, 20,…

MyEclipse 8.5安装Aptana

Aptana简介 Aptana是一个非常强大,开源,专注于JavaScript的Ajax开发IDE它的特性包括&#xff1a; 1、JavaScript,JavaScript函数,HTML,CSS语言的Code Assist功能 2、Outliner(大纲)&#xff1a;显示JavaScript,HTML和CSS的代码结构 3、支持 JavaScript&#xff0c…

2016-1-10 手势解锁demo的实现

一&#xff1a;实现自定义view&#xff0c;在.h,.m文件中代码如下: #import <UIKit/UIKit.h> class ZLLockView; protocol ZLLockViewDelegate <NSObject> - (void)lockView:(ZLLockView *)lockView didSelectedPwd: (NSString *)pwd; end interface ZLLockView : …

GWT入门

GWT是Google Web Development Kit的缩写&#xff0c;可让程序员使用Java开发Ajax Web应用程序。 GWT编译器将Java代码转换为JavaScript和html代码。 GWT应用程序称为模块&#xff0c;并且使用xml文件描述模块&#xff0c;假定该模块名称为xml文件的“ mymodule”名称为“ mymod…

AJAX入门——工作原理

理解同步交互和异步交互 举个例子&#xff1a;普通B/S模式(同步) AJAX技术(异步) * 同步&#xff1a; 提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事。 发送方发出数据后&#xff0c;等接收方发回响应以后才发下一个数据包的…

Android Studio IDE Out of Memory

场景&#xff1a; 尝试过各种方式&#xff0c;IDE重装&#xff0c;重新启动&#xff0c;设置IDE MEMORY大小JDK MEMORY大小都无效 终于在FILE->INVALIDATE CACHES/RESTART 中点击重新启动之后问题攻克了。转载于:https://www.cnblogs.com/yxwkf/p/5128094.html

在Spring MVC REST应用程序中自动生成WADL

上一次我们学习了WADL的基础知识 。 语言本身并没有那么有趣&#xff0c;只写了一篇有关它的文章&#xff0c;但是本文的标题揭示了为什么我们需要这些知识。 JSR 311的许多实现&#xff1a;JAX-RS&#xff1a;RESTful Web服务的Java API提供了开箱即用的运行时WADL生成&#x…

关于DJANGO和JAVASCRIPT的时间

最近&#xff0c;实际一些简单统计时&#xff0c;要到库里去检索数据出来用HIGHCHARTS画图&#xff0c; 作一个简单的回照。。 DJANGO用TEMPLATEVIEW来作。专业&#xff0c;正规&#xff1a;&#xff09; class SAView(TemplateView):template_name version/sa_site.htmlpagin…

Vue.js组件学习

组件可以扩展HTML元素&#xff0c;封装可重用的HTML代码&#xff0c;我们可以将组件看作自定义的HTML元素。组件系统提供了一种抽象&#xff0c;让我们可以使用独立可复用的小组件来构建大型应用。 一个简单组件例子(全局注册&#xff09; <!DOCTYPE html> <html>&…

Winform MD5

1&#xff1a;MD5 http://www.cmd5.com/ 字节数组----字符串 //将字节数组中每个元素按照指定的编码格式解析成字符串//直接将数组ToString()//将字节数组中的每个元素ToString() //ToString("Params") ToString("x") //可以将十进制字符串转换为16进制字符…

HTML元素显示与隐藏

在WEB开发中&#xff0c;前台HTML中经常需要控制元素的隐藏与显示&#xff0c;我们最为最常见是二级导航栏&#xff08;通过鼠标的移动来触发onmouseover&#xff0c;onmouseout事件来实现二级菜单的显示与隐藏&#xff09;二级菜单的显示与隐藏。 然而控制元素的影响与显示有…

C#控件大小随窗体大小等比例变化

相信很多博友在开发初次接触学习C# winForm时&#xff0c;当窗体大小变化时&#xff0c;窗体内的控件并没有随着窗体的变化而变化&#xff0c;最近因为一个项目工程的原因&#xff0c;也需要解决这个问题。通过查阅和学习&#xff0c;这个问题得到了解决&#xff0c;或许不是很…

公共样式_设计干货 | 园路铺装的100种样式,保存收好

Part 1园路的形式主干道&#xff1a;联系全园&#xff0c;必须考虑通行、生产、救护、消防、游览的需要。次干道&#xff1a;沟通各景点、建筑&#xff0c;通轻型车辆。休闲小径、健康步道&#xff1a;健康步道是近年来最为流行的足底按摩健身方式。通过行走卵石路上按摩足底穴…

22个所见即所得在线 Web 编辑器

新闻来源:sixrevisions.com我们曾介绍过 10 个基于 JavaScript 的 WYSIWYG&#xff08;所见即所得&#xff09; 编辑器&#xff0c;这些 Web 编辑器可以在线编辑和处理富 Web 内容&#xff0c;包括格式文本&#xff0c;表格&#xff0c;图片&#xff0c;媒体&#xff0c;链接等…

iOS学习心得——UITableViewCell的复用

UITableView是在iOS开发中最常用的控件之一。我的第一篇学习心得献给它了UITableView是由一行一行的UITableViewCell构成的。首先想这样一个问题&#xff1a;现在用UITableView去做一个联系人列表&#xff0c;如果我有10个100个联系人&#xff0c;那我可以建10个100 个UITab…

Java EE 7的高峰–使用EclipseLink的多租户示例

水族馆是有关所有相关规范和参考实现中有关Java EE进度的灵感和最新信息的重要来源。 他们从Oracle的Shaun Smith&#xff08; 博客 / twitter &#xff09;获得了关于EclipseLink作为开源项目的地位和未来的演讲。 他介绍了将在EclipseLink 2.4中提供的所有新功能&#xff0c;…

带有Java和Axis2的JSON Web服务

我最近遇到一位客户&#xff0c;要求我使用Java Web服务重建其旧产品。 他们希望它模块化并且易于使用。 我想到的第一件事是使用宁静的方法。 但是让我烦恼的是&#xff0c;Java宁静的方法是使用XML !&#xff0c;我更喜欢一种更简单的通信方式&#xff0c;易于理解和解析的数…