MySQL中with?rollup的用法及說明
MySQL with rollup的用法
當(dāng)需要對(duì)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行分類統(tǒng)計(jì)的時(shí)候,往往會(huì)用上groupby進(jìn)行分組。
而在groupby后面還可以加入withcube和withrollup等關(guān)鍵字對(duì)數(shù)據(jù)進(jìn)行匯總。
with rollup概述
with在sql語句中定義在group by之后。當(dāng)需要對(duì)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行分類統(tǒng)計(jì)的時(shí)候,往往會(huì)用上groupby進(jìn)行分組。
而在groupby后面還可以加入withcube和withrollup等關(guān)鍵字對(duì)數(shù)據(jù)進(jìn)行匯總。
不過這個(gè)cube在mysql中并不適用。

應(yīng)用實(shí)例
現(xiàn)在有這樣一張學(xué)生表,里面的數(shù)據(jù)如下所示。

如果想對(duì)根據(jù)學(xué)生,對(duì)科目,分?jǐn)?shù)求和,可以這樣寫。

如果想在這個(gè)的基礎(chǔ)上,求出學(xué)生的總分?jǐn)?shù),應(yīng)該怎么做。

使用 WITH ROLLUP,此函數(shù)是對(duì)聚合函數(shù)進(jìn)行求和,注意 with rollup是對(duì) group by 后的第一個(gè)字段,進(jìn)行分組求和。

ORDER BY不能在rollup中使用,兩者為互斥關(guān)鍵字,如果使用,會(huì)拋出以下錯(cuò)誤:Error Code:1221. Incorrect usage of CUBE/ROLLUP and ORDER BY。mysql5.7中是不支持的,在8.0以后支持。


相信大家已經(jīng)知道如何使用with rollup了,這個(gè)就是在group by分組之后,再次對(duì)聚合函數(shù)進(jìn)行求和。
MySQL with rollup 聚合函數(shù)類似oracle cube操作
作用
在分組統(tǒng)計(jì)數(shù)據(jù)的基礎(chǔ)上再進(jìn)行統(tǒng)計(jì)匯總
題目示例

根據(jù)題目意思需要 求每個(gè)價(jià)格區(qū)間,時(shí)間的mark=0的和/mark=1的和
最后還有求個(gè)所有價(jià)格區(qū)間 按月份的mark=0的和/mark=1的和
SELECT PriceBand, YearMonth, sum( CASE Mark WHEN 0 THEN VALUE END ) / sum( CASE Mark WHEN 1 THEN VALUE END ) FROM test GROUP BY YearMonth, PriceBand UNION ALL SELECT 'Alll priceBand', YearMonth, sum( CASE Mark WHEN 0 THEN VALUE END ) / sum( CASE Mark WHEN 1 THEN VALUE END ) FROM test GROUP BY YearMonth
在不知道m(xù)ysql有 這種聚合函數(shù)的情況 我所想到的只能靠這樣拼接來實(shí)現(xiàn)

使用rollup后
SELECT ifnull( PriceBand, 'All priceBand' ), YearMonth, sum( CASE Mark WHEN 0 THEN VALUE END ) / sum( CASE Mark WHEN 1 THEN VALUE END ) FROM test GROUP BY YearMonth, PriceBand WITH ROLLUP HAVING YearMonth IS NOT NULL

注意
在mysql5.6.17版本中,只定義了cube,但是不支持cube操作。
cube也是一種對(duì)數(shù)據(jù)的聚合操作。但是rollup只在層次上對(duì)數(shù)據(jù)進(jìn)行聚合,而cube對(duì)所有的維度進(jìn)行聚合。具有N個(gè)維度的列,cube需要2的N次方次分組操作,而rollup只需要N次分組操作。
rollup和cube的區(qū)別:
1)假設(shè)有n個(gè)維度,rollup會(huì)有n個(gè)聚合:
- rollup(a,b) 統(tǒng)計(jì)列包含:(a,b)、(a)、()
- rollup(a,b,c)統(tǒng)計(jì)列包含:(a,b,c)、(a,b)、(a)、()
2)假設(shè)有n個(gè)緯度,cube會(huì)有2的n次方個(gè)聚合
- cube(a,b) 統(tǒng)計(jì)列包含:(a,b)、(a)、(b)、()
- cube(a,b,c) 統(tǒng)計(jì)列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、©、()
在mysql中 with rollup放的位置是有要求的

之前的group by 正常使用分組 加了 with rollup 在那個(gè)字段后就對(duì)所有價(jià)格區(qū)間進(jìn)行統(tǒng)計(jì) 同時(shí) with rollup 并不能放在 (group by a with rollup,b )中間
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
windows下mysql數(shù)據(jù)庫主從配置教程
這篇文章主要為大家詳細(xì)介紹了windows下mysql數(shù)據(jù)庫主從配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
MySQL中存儲(chǔ)時(shí)間的最佳實(shí)踐指南
這篇文章主要給大家介紹了關(guān)于MySQL中存儲(chǔ)時(shí)間的最佳實(shí)踐,文中詳細(xì)介紹了哪種存儲(chǔ)時(shí)間的方式更好,對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-07-07
Windows下mysql community server 8.0.16安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows下mysql community server 8.0.16安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
MySQL中事務(wù)概念的簡潔學(xué)習(xí)教程
這篇文章主要介紹了MySQL中的事務(wù)概念,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11
VS2019連接mysql8.0數(shù)據(jù)庫的教程圖文詳解
這篇文章主要介紹了VS2019連接mysql8.0數(shù)據(jù)庫的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05

