最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中WITH ROLLUP的具體使用

 更新時間:2025年07月17日 11:20:30   作者:羚風(fēng)雯  
本文主要介紹了MySQL中WITH ROLLUP的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

今天第一次知道有這個用法,記錄一下吧

WITH ROLLUP 是 MySQL 中一個非常實用的 GROUP BY 擴(kuò)展功能,用于生成分層匯總報表。它確實不像基礎(chǔ) SQL 語句那樣常見,但在數(shù)據(jù)分析場景中非常強大。

1. ROLLUP 的基本功能

WITH ROLLUP 會在 GROUP BY 分組結(jié)果的基礎(chǔ)上:

  • 為每個分組層級添加小計行
  • 最后添加一個總計行
  • 生成的匯總行中,被匯總的列顯示為 NULL

2. 實際案例解析

假設(shè)有銷售數(shù)據(jù)表 sales_data

| category | region  | sales |
|----------|---------|-------|
| 電子產(chǎn)品 | 華北    | 1000  |
| 電子產(chǎn)品 | 華東    | 1500  |
| 家居用品 | 華北    | 800   |
| 家居用品 | 華南    | 1200  |

執(zhí)行你的示例查詢:

SELECT 
    IFNULL(category, 'All Categories') as category,
    IFNULL(region, 'All Regions') as region,
    SUM(sales) as total_sales
FROM sales_data
GROUP BY category, region WITH ROLLUP;

結(jié)果將是:

| category       | region      | total_sales |
|----------------|-------------|-------------|
| 電子產(chǎn)品      | 華北        | 1000        |
| 電子產(chǎn)品      | 華東        | 1500        |
| 電子產(chǎn)品      | All Regions | 2500        | ← 電子產(chǎn)品小計
| 家居用品      | 華北        | 800         |
| 家居用品      | 華南        | 1200        |
| 家居用品      | All Regions | 2000        | ← 家居用品小計
| All Categories | All Regions | 4500        | ← 總計行

3. ROLLUP 的層級關(guān)系

對于 GROUP BY a, b, c WITH ROLLUP,它會生成:

  1. 基礎(chǔ)分組 (a, b, c)
  2. 一級小計 (a, b, NULL)
  3. 二級小計 (a, NULL, NULL)
  4. 總計 (NULL, NULL, NULL)

4. 實際應(yīng)用場景

(1) 銷售報表分析

SELECT 
    YEAR(order_date) as year,
    QUARTER(order_date) as quarter,
    MONTH(order_date) as month,
    SUM(amount) as revenue
FROM orders
GROUP BY YEAR(order_date), QUARTER(order_date), MONTH(order_date)
WITH ROLLUP;

(2) 庫存分類統(tǒng)計

SELECT 
    warehouse,
    product_type,
    COUNT(*) as item_count,
    SUM(quantity) as total_quantity
FROM inventory
GROUP BY warehouse, product_type WITH ROLLUP;

5. 高級用法技巧

(1) 識別匯總行

SELECT 
    category,
    region,
    SUM(sales) as total_sales,
    GROUPING(category) as is_category_summary,
    GROUPING(region) as is_region_summary
FROM sales_data
GROUP BY category, region WITH ROLLUP;

(2) 多維度交叉分析

SELECT 
    IFNULL(category, 'Total') as category,
    SUM(CASE WHEN region='華北' THEN sales END) as north,
    SUM(CASE WHEN region='華東' THEN sales END) as east,
    SUM(sales) as subtotal
FROM sales_data
GROUP BY category WITH ROLLUP;

6. 與其他數(shù)據(jù)庫的對比

功能MySQLSQL ServerOraclePostgreSQL
WITH ROLLUP????
GROUPING SETS????
CUBE????

在不支持 ROLLUP 的數(shù)據(jù)庫中,可以使用 UNION ALL 組合多個查詢來模擬。

7. 性能注意事項

  • ROLLUP 會在服務(wù)器端生成額外的匯總行
  • 大數(shù)據(jù)集時可能影響性能
  • 考慮在應(yīng)用層實現(xiàn)類似邏輯(特別是Web分頁時)

8. 為什么你可能沒見過?

  1. 業(yè)務(wù)場景限制:常規(guī)CRUD操作不需要
  2. 替代方案:有些團(tuán)隊用應(yīng)用代碼計算匯總
  3. 報表工具:BI工具通常內(nèi)置了匯總功能
  4. 新版本特性:不是所有開發(fā)者都熟悉較新的SQL功能

ROLLUP 特別適合需要生成:
? 分類小計報表
? 多層匯總統(tǒng)計
? 財務(wù)或銷售分析報表

下次需要做分層匯總時,可以嘗試使用這個強大的功能。

案例:SQL175 有取消訂單記錄的司機(jī)平均評分

select
    COALESCE(driver_id, '總體') as driver_id,
    round(avg(grade), 1) as grade
from
    tb_get_car_order
where
    driver_id in (
        select
            driver_id
        from
            tb_get_car_record
            join tb_get_car_order using (order_id)
        where
            year(order_time) = 2021
            and month(order_time) = 10
            and start_time is null
    )
    and grade is not null
group by
    driver_id
WITH
    ROLLUP
ORDER BY
    driver_id IS NULL,
    driver_id

SQL 筆記:WITH ROLLUP 和 ORDER BY 的配合使用

問題背景

當(dāng)使用 WITH ROLLUP 生成匯總行時,匯總行的分組列值為 NULL。如果我們想給這個 NULL 值賦予一個有意義的名稱(如"總體"或"總計"),并在排序時確保這一行顯示在最后,需要注意一些技巧。

解決方案

1. 使用 COALESCE 或 IFNULL 重命名匯總行

SELECT
    COALESCE(driver_id, '總體') AS driver_id,
    ROUND(AVG(grade), 1) AS grade
FROM ...
GROUP BY driver_id WITH ROLLUP

2. 正確排序確保匯總行在最后

當(dāng)添加 ORDER BY 時,簡單的按列排序會導(dǎo)致"總體"行按字母順序排列,而不是顯示在最后。解決方案:

方法一:利用 NULL 值排序特性

ORDER BY driver_id IS NULL, driver_id

• driver_id IS NULL:對于匯總行返回 1,其他行返回 0

• 這樣匯總行會排在最后,其他行按 driver_id 排序

方法二:使用 CASE 表達(dá)式

ORDER BY CASE WHEN driver_id IS NULL THEN 1 ELSE 0 END, driver_id

• 更顯式地控制排序優(yōu)先級

關(guān)鍵點

  1. WITH ROLLUP 生成的匯總行的分組列值為 NULL
  2. 使用 COALESCE/IFNULL 可以美化顯示這個 NULL 值
  3. 排序時需要特殊處理才能確保匯總行在最后
  4. ORDER BY column IS NULL 是一個簡潔有效的解決方案

到此這篇關(guān)于MySQL中WITH ROLLUP的具體使用的文章就介紹到這了,更多相關(guān)MySQL WITH ROLLUP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 關(guān)于Mysql8.0版本驅(qū)動getTables返回所有庫的表問題淺析

    關(guān)于Mysql8.0版本驅(qū)動getTables返回所有庫的表問題淺析

    這篇文章主要給大家介紹了關(guān)于Mysql 8.0版本驅(qū)動getTables返回所有庫的表問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Mysql中使用sql語句生成雪花算法Id

    Mysql中使用sql語句生成雪花算法Id

    雪花算法是一種生成全局唯一ID的分布式算法,本文主要介紹了Mysql中使用sql語句生成雪花算法Id,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • mysql 操作總結(jié) INSERT和REPLACE

    mysql 操作總結(jié) INSERT和REPLACE

    用于操作數(shù)據(jù)庫的SQL一般分為兩種,一種是查詢語句,也就是我們所說的SELECT語句,另外一種就是更新語句,也叫做數(shù)據(jù)操作語句。
    2009-07-07
  • MySQL中聯(lián)表更新與刪除的語法介紹

    MySQL中聯(lián)表更新與刪除的語法介紹

    這篇文章主要給大家介紹了MySQL中聯(lián)表更新與刪除的語法,文中通過示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01
  • Mysql保持現(xiàn)有內(nèi)容在后面增加內(nèi)容的sql語句

    Mysql保持現(xiàn)有內(nèi)容在后面增加內(nèi)容的sql語句

    這篇文章主要介紹了Mysql保持現(xiàn)有內(nèi)容在后面增加內(nèi)容的sql語句,需要的朋友可以參考下
    2017-05-05
  • 通過MySQL慢查詢優(yōu)化MySQL性能的方法講解

    通過MySQL慢查詢優(yōu)化MySQL性能的方法講解

    今天小編就為大家分享一篇關(guān)于通過MySQL慢查詢優(yōu)化MySQL性能的方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • MySQL主從搭建(多主一從)的實現(xiàn)思路與步驟

    MySQL主從搭建(多主一從)的實現(xiàn)思路與步驟

    通過MySQL主從配置,可以實現(xiàn)讀寫分離減輕數(shù)據(jù)庫壓力,最近正好遇到這個功能,所以這篇文章主要給大家介紹了關(guān)于MySQL主從搭建(多主一從)的實現(xiàn)思路與步驟,需要的朋友可以參考下
    2021-05-05
  • MySQL中如何正確存儲IP地址

    MySQL中如何正確存儲IP地址

    在MySQL中,當(dāng)存儲IPv4地址時,應(yīng)該使用32位的無符號整數(shù)(UNSIGNED INT)來存儲IP地址,而不是使用字符串,下面就來詳細(xì)的介紹一下具體原因,感興趣的可以了解一下
    2023-05-05
  • MySql 5.7.17壓縮包免安裝的配置過程圖解

    MySql 5.7.17壓縮包免安裝的配置過程圖解

    這篇文章主要介紹了MySql 5.7.17壓縮包免安裝的配置過程圖解,本文圖文并茂給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • MySQL慢查詢問題排查方式

    MySQL慢查詢問題排查方式

    文章介紹了MySQL慢查詢排查的步驟,包括查看當(dāng)前正在運行的事務(wù)狀態(tài)、查看線程狀態(tài)、殺死線程、輔助判斷命令、開啟慢查詢?nèi)罩竞烷_啟通用查詢?nèi)罩?/div> 2025-02-02

最新評論

陆川县| 桓台县| 栾城县| 宣化县| 马公市| 申扎县| 明光市| 泽州县| 石嘴山市| 巴南区| 历史| 闽侯县| 江达县| 榆树市| 攀枝花市| 本溪市| 明水县| 日土县| 吉林省| 青田县| 望江县| 海伦市| 麻江县| 黎平县| 光泽县| 梅州市| 曲水县| 峡江县| 壶关县| 吉安市| 扶风县| 赤峰市| 宜都市| 广丰县| 湖口县| 肥城市| 商城县| 松潘县| 兴城市| 天镇县| 枝江市|