程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫中如何用GROUPING SETS進行分組自定義

Oracle數據庫中如何用GROUPING SETS進行分組自定義

編輯:Oracle數據庫基礎

以下的文章主要介紹的實施在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樣本模式:

  1. SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)  
  2. FROM sales  
  3. WHERE cust_id < 3 
  4. GROUP BY CUBE (prod_id, cust_id, channel_id) 

這將生成8組總數:

所有行的總和

每個通道,包括所有產品和顧客。

每個顧客,包括所有產品和通道。

每項產品,包括所有顧客和通道。

每個通道/顧客組合,包括所有產品。

每個通道/產品組合,包括所有顧客。

每個產品/顧客組合,包括所有通道。

每個產品、顧客和通道組合。

可能的組合非常多。GROUP BY CUBE中每增加一列,生成的總數就會翻一番。

可以用GROUP BY GROUPING SETS來代替GROUP BY CUBE。你可以應用來指定你感興趣的總數組合。因為它不必計算它不需要集合(也不會產生太多結果),所以對SQL引擎來說更為高效。

其格式為:

  1. GROUP BY GROUPING SETS ((list), (list) ... ) 

這裡(list)是圓括號中的一個列序列,這個組合生成一個總數。要增加一個總和,必須增加一個(NUlL)分組集。

例如,如果只要生成每項產品(包括所有顧客和通道)和每個顧客/通道組合(包括所有產品)的總數,可以輸入:

  1. SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)  
  2. FROM sales  
  3. WHERE cust_id < 3 
  4. GROUP BY GROUPING SETS (  
  5. (prod_id), (cust_id, channel_id)  
  6. ); 

這種方法將這個數據集生成的總數數量從180個減少到37個,並幫助你著重回答你希望解答的問題。以上的相關內容就是對Oracle GROUPING SETS進行分組自定義的匯總的介紹,望你能有所收獲。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved