什么樣的網(wǎng)站必須做備案貼吧高級搜索
在數(shù)據(jù)分析和報表制作中,通常需要對數(shù)據(jù)進(jìn)行匯總和分組,我們常用的就是GROUP BY匯總數(shù)據(jù),當(dāng)我們想按照不同維度匯總時,往往需要編寫多個GROUP BY預(yù)計,而借助ROLLUP 和 CUBE 函數(shù)可以一次性生成子總計和總計行,而不需要編寫多個 SQL 查詢語句。這樣可以節(jié)省時間和精力,提高數(shù)據(jù)分析和報表制作的效率。
CUBE 和 ROLLUP 的區(qū)別
下面是 CUBE 和 ROLLUP 之間的具體區(qū)別及實例:
- 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ù)生成子總計和總計行
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 表示總計行,包括所有日期和地區(qū)的銷售額總計。
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ū)的小計行和總計行,例如,NULL 和 North 表示所有日期的 North 地區(qū)的小計行和總計行。
區(qū)別開表中某列自身的NULL值和的小計行的NULL(匯總行重命名)
以CUBE函數(shù)為例,在使用 CUBE 函數(shù)時,小計行的 NULL 值與表中某列的 NULL 值是不同的。在 CUBE 函數(shù)中,NULL 值表示所有列的小計行。如果您想?yún)^(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計行的 NULL 值,可以使用 GROUPING 函數(shù)。
GROUPING 函數(shù)可用于檢查指定列是否包含在 CUBE 函數(shù)的當(dāng)前小計行中。如果列包含在當(dāng)前小計行中,則 GROUPING 函數(shù)返回 1,否則返回 0。因此,您可以使用 GROUPING 函數(shù)來區(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計行的 NULL 值。
以下是一個示例 SQL 語句,演示如何使用 GROUPING 函數(shù)來區(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計行的 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)前小計行中,GROUPING 函數(shù)將返回 1,否則返回 0。通過將 GROUPING 函數(shù)的結(jié)果與 CASE 語句結(jié)合使用,我們可以將包含在當(dāng)前小計行中的列標(biāo)記為 “Total”,從而區(qū)分表中某列的 NULL 值和 CUBE 函數(shù)中的小計行的 NULL 值。