什么樣的網(wǎng)站必須做備案貼吧高級(jí)搜索
在數(shù)據(jù)分析和報(bào)表制作中,通常需要對(duì)數(shù)據(jù)進(jìn)行匯總和分組,我們常用的就是GROUP BY匯總數(shù)據(jù),當(dāng)我們想按照不同維度匯總時(shí),往往需要編寫(xiě)多個(gè)GROUP BY預(yù)計(jì),而借助ROLLUP 和 CUBE 函數(shù)可以一次性生成子總計(jì)和總計(jì)行,而不需要編寫(xiě)多個(gè) SQL 查詢語(yǔ)句。這樣可以節(jié)省時(shí)間和精力,提高數(shù)據(jù)分析和報(bào)表制作的效率。
CUBE 和 ROLLUP 的區(qū)別
下面是 CUBE 和 ROLLUP 之間的具體區(qū)別及實(shí)例:
- CUBE 生成的結(jié)果集顯示了所選列中值的所有組合的聚合。
- ROLLUP 生成的結(jié)果集顯示了所選列中值的某一層次結(jié)構(gòu)的聚合。
-- 創(chuàng)建示例表格
CREATE TABLE sales_data (date DATE,region VARCHAR(50),sales DECIMAL(10, 2)
);-- 插入示例數(shù)據(jù)
INSERT INTO sales_data (date, region, sales) VALUES('2021-01-01', 'North', 1000),('2021-01-02', 'North', 1500),('2021-01-03', 'North', 2000),('2021-01-01', 'South', 800),('2021-01-02', 'South', 1200),('2021-01-03', 'South', 1800);
1、ROLLUP示例
-- 使用 ROLLUP 函數(shù)生成子總計(jì)和總計(jì)行
SELECT date, region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY ROLLUP(date, region);
輸出結(jié)果:
date region total_sales
2021-01-01 North 1000.00
2021-01-01 South 800.00
2021-01-02 North 1500.00
2021-01-02 South 1200.00
2021-01-03 North 2000.00
2021-01-03 South 1800.00
2021-01-01 NULL 1800.00
2021-01-02 NULL 2700.00
2021-01-03 NULL 3800.00
NULL NULL 8300.00
上面的結(jié)果中,NULL 表示總計(jì)行,包括所有日期和地區(qū)的銷(xiāo)售額總計(jì)。
2、CUBE示例
-- 使用 CUBE 函數(shù)生成所有可能的聚合數(shù)據(jù)組合
SELECT date, region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY CUBE(date, region);
輸出結(jié)果:
date region total_sales
2021-01-01 North 1000.00
2021-01-01 South 800.00
2021-01-02 North 1500.00
2021-01-02 South 1200.00
2021-01-03 North 2000.00
2021-01-03 South 1800.00
2021-01-01 NULL 1800.00
2021-01-02 NULL 2700.00
2021-01-03 NULL 3800.00
NULL North 4500.00
NULL South 3800.00
NULL NULL 8300.00
上面的結(jié)果中,NULL 表示所有日期或所有地區(qū)的小計(jì)行和總計(jì)行,例如,NULL 和 North 表示所有日期的 North 地區(qū)的小計(jì)行和總計(jì)行。
區(qū)別開(kāi)表中某列自身的NULL值和的小計(jì)行的NULL(匯總行重命名)
以CUBE函數(shù)為例,在使用 CUBE 函數(shù)時(shí),小計(jì)行的 NULL 值與表中某列的 NULL 值是不同的。在 CUBE 函數(shù)中,NULL 值表示所有列的小計(jì)行。如果您想?yún)^(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計(jì)行的 NULL 值,可以使用 GROUPING 函數(shù)。
GROUPING 函數(shù)可用于檢查指定列是否包含在 CUBE 函數(shù)的當(dāng)前小計(jì)行中。如果列包含在當(dāng)前小計(jì)行中,則 GROUPING 函數(shù)返回 1,否則返回 0。因此,您可以使用 GROUPING 函數(shù)來(lái)區(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計(jì)行的 NULL 值。
以下是一個(gè)示例 SQL 語(yǔ)句,演示如何使用 GROUPING 函數(shù)來(lái)區(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計(jì)行的 NULL 值(匯總行重命名):
SELECT CASE WHEN GROUPING(column_name) = 1 THEN 'Total' ELSE column_name END AS column_name,SUM(value)
FROM table_name
GROUP BY CUBE(column_name)
在上面的示例中,如果 column_name 列包含在 CUBE 函數(shù)的當(dāng)前小計(jì)行中,GROUPING 函數(shù)將返回 1,否則返回 0。通過(guò)將 GROUPING 函數(shù)的結(jié)果與 CASE 語(yǔ)句結(jié)合使用,我們可以將包含在當(dāng)前小計(jì)行中的列標(biāo)記為 “Total”,從而區(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計(jì)行的 NULL 值。