以下的文章主要介紹的實施在Oracle GROUPING SETS進行分組自定義的匯總,本文章主要是通過作者在實際操作中的經驗,來講述在Oracle數據庫中正確使用GROUPING SETS分組自定義。
當你與COUNT和SUM這類總計函數一起使用GROUP BY語句時,你一般得不到多級總數。GROUP BY中每個唯一的列組合生成一個總數,但這些總數不會“累加”到更高一級的總數中。
要實現這一點,你可以用GROUP BY ROLLUP或GROUP BY CUBE替代GROUP BY,不過它們會生成所有可能的總數,而你可能不需要全部總數。對GROUP BY CUBE而言,將會生成2^n組總數,這裡的n是GROUP BY中列的數目。
查看下面的查詢,它使用了SH樣本模式:
- SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)
- FROM sales
- WHERE cust_id < 3
- GROUP BY CUBE (prod_id, cust_id, channel_id)
這將生成8組總數:
所有行的總和
每個通道,包括所有產品和顧客。
每個顧客,包括所有產品和通道。
每項產品,包括所有顧客和通道。
每個通道/顧客組合,包括所有產品。
每個通道/產品組合,包括所有顧客。
每個產品/顧客組合,包括所有通道。
每個產品、顧客和通道組合。
可能的組合非常多。GROUP BY CUBE中每增加一列,生成的總數就會翻一番。
可以用GROUP BY GROUPING SETS來代替GROUP BY CUBE。你可以應用來指定你感興趣的總數組合。因為它不必計算它不需要集合(也不會產生太多結果),所以對SQL引擎來說更為高效。
其格式為:
- GROUP BY GROUPING SETS ((list), (list) ... )
這裡(list)是圓括號中的一個列序列,這個組合生成一個總數。要增加一個總和,必須增加一個(NUlL)分組集。
例如,如果只要生成每項產品(包括所有顧客和通道)和每個顧客/通道組合(包括所有產品)的總數,可以輸入:
- SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)
- FROM sales
- WHERE cust_id < 3
- GROUP BY GROUPING SETS (
- (prod_id), (cust_id, channel_id)
- );
這種方法將這個數據集生成的總數數量從180個減少到37個,並幫助你著重回答你希望解答的問題。以上的相關內容就是對Oracle GROUPING SETS進行分組自定義的匯總的介紹,望你能有所收獲。