按匯總分組/多維數據集

時不時地,您會遇到一個使您達到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.pswp.cn/news/373836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373836.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCPUDP

TCP(傳輸控制協議) 建立連接,形成傳輸數據的通道在連接中進行大數據傳輸(數據大小不受限制)通過三次握手完成連接,是可靠協議,安全送達(三次握手向服務器發送請求,響應請求回復,發送…

Windows和linux雙系統——修改默認啟動順序

電腦上裝了Windows 7和Ubantu雙系統,由于Linux系統用的次數比較少并且還是默認的啟動項對此很不能容忍,因此得修改Windows為默認的啟動項。 由于電腦上的系統引導程序是GRUB,因此修改當然也就落到Linux系統上啦。 修改/boot/grub/grub.cfg該文…

ft232h引腳_usb轉串口芯片 ft232的奇怪現象

硬件平臺:stm32f407ft232RL按照手冊上的電路,我用USB接口給ft232RL供電,如下圖:0288f358ccd0026690b2443b41d98f0f_224.png (0 Bytes, 下載次數: 12)2010-12-14 22:54 上傳我在這個電路的基礎上我用單片機串口和芯片對應的TX和RX相…

微軟Team Foundation Service 的Scrum模板中的Feature和Backlog Items 的區別【轉載】

Features help us plan work better in Team Foundation Service Scrum process 【原文:http://www.nsilverbullet.net/2013/06/04/features-help-us-plan-work-better-in-team-foundation-service-scrum-process/】 Recently a new work item type named “Featur…

LeWeb – 2011 –綜述

在我去機場前幾個小時,我將寫最后一篇與LeWeb相關的文章。 這次,我將專注于會議本身。 參加過幾次開發人員會議(雖然不多,但足以給您帶來一定的經驗),我已經開發了自己的自定義會議等級框架。 我使用以下6條…

Java 入門基礎——面向對象的特征

計算機軟件系統是現實生活中的業務在計算機中的映射,而現實生活中的業務其實就是一個個對象協作的過程。面向對象編程就是按現實業務一樣的方式將程序代碼按一個個對象進行組織和編寫,讓計算機系統能夠識別和理解用對象方式組織和編寫的程序代碼&#xf…

(總結)密碼破解之王:Ophcrack彩虹表(Rainbow Tables)原理詳解(附:120G彩虹表下載)...

http://www.ha97.com/4009.html轉載于:https://www.cnblogs.com/chaizp/p/5111188.html

python游走代碼_介紹一個全局最優化的方法:隨機游走算法(Random Walk)

1. 關于全局最優化求解全局最優化是一個非常復雜的問題,目前還沒有一個通用的辦法可以對任意復雜函數求解全局最優值。上一篇文章講解了一個求解局部極小值的方法——梯度下降法。這種方法對于求解精度不高的情況是實用的,可以用局部極小值近似替代全局最…

iOS單元測試

iOS單元測試異步測試需要建立預期,因為蘋果的單元測試都是同步的,測試到異步的時候建立一個預期,預期如果在規定時間(自定義)完成,代表單元測試通過。 還有 猴子測試 ,就是去github上找到猴子測…

調試JVM

在某些(極少數)情況下,您可能會遇到使JVM本身崩潰的情況。 我最近通過將ThreadGroup的名稱設置為null來進行管理 。 在這些情況下,調試JVM本身很有用,這樣可以更精確地定位崩潰。 這是完成此操作的步驟(它們…

javaScript DOM編程常用的方法與屬性

DOM是Document Object Model文檔對象模型的縮寫。根據W3C DOM規范,DOM是一種與瀏覽器,平臺,語言無關的接口,使得你可以訪問頁面其他的標準組件。 Node接口的特性和方法 特性/方法類型/放回類型說明nodeName String 節點的名字;根…

一:驗證微信的Token

前言:申請到微信公眾號的同學,可能會挺感興趣的,畢竟微信公眾號,確實是一個好東西,它提供了一個很好的平臺,而且它自帶有一套管理模板,對于微信公眾號可以很好的管理。 但是也僅僅是很好的管理,…

三、 將DataTable 轉換為List

1. 方法public static IList<T> ConvertTo<T>(DataTable table) { if (table null) { return null; } List<DataRow> rows new List<DataRow>(); foreach (DataRow row in table.Rows) { rows.Add(row); } return ConvertTo<T>(rows); }2. 調用…

ActiveMQ已準備好黃金時段

ActiveMQ項目始于2005年-在很大程度上&#xff0c;它一直是Apache Software Foundation的頂級項目。 ActiveMQ項目的目的一直是提供世界一流的企業消息傳遞解決方案&#xff0c;其中經紀人能夠提供從支持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 : …

php與JAVA的RSA加密互通

Java 版本RSA 進行加密解密 在網上查詢了好幾天&#xff0c;最終找到解決方案&#xff0c;網絡上都是通過Cipher.getInstance("RSA"); 而改成Cipher.getInstance("RSA/ECB/PKCS1Padding");就可以實現與php版本公鑰和密鑰互通了。 Cipher cipher Cipher.ge…

GWT入門

GWT是Google Web Development Kit的縮寫&#xff0c;可讓程序員使用Java開發Ajax Web應用程序。 GWT編譯器將Java代碼轉換為JavaScript和html代碼。 GWT應用程序稱為模塊&#xff0c;并且使用xml文件描述模塊&#xff0c;假定該模塊名稱為xml文件的“ mymodule”名稱為“ mymod…

JavaScript省市二級聯動

XML文件負責保存所需要的數據&#xff0c;而HTML文件負責通過javascript解析XML數據并顯示在頁面上。代碼如下&#xff1a; cities.xml <?xml version"1.0" encoding"GB2312"?> <china><province name"吉林省"><city>…