Oracle 高級分組


 

 
1.rollup:rollup 是group by 的擴展,它只能出現在group by后面。主要是為了解決多層分組的問題。語法:
SELECT  . . . 
FROM  . . . 
GROUP BY ROLLUP (ordered list of grouping columns)
例如要查詢每個部門的工資總和所有部門的總和
TEST@orcl> select dept_id,sum(salary) from employee group by rollup(dept_id);
   DEPT_ID SUM(SALARY)
---------- -----------
        10        8750
        20        9900
        30        9400
<null>           28050
如果rollup()有兩列,將會有3個分組例如:
group by rollup(year,month)相當於
group by year,month
union
group by year
union
group by null;
----------------------------------------------
TEST@orcl> select year,month,sum(tot_sales) from all_orders
  2  group by rollup(year,month);
 
      YEAR      MONTH SUM(TOT_SALES)
---------- ---------- --------------
      2000          1        2997866
      2000          2        3325690
      2000          3        3719014
      2000          4        3497570
      2000          5        3640628
      2000          6        3146822
      2000          7        3446480
      2000          8        2973882
      2000          9        3207396
      2000         10        3193212
      2000         11        3096300
      2000         12        3278944
      2000 <null>           39523804
      2001          1        1498933
      2001          2        1662845
      2001          3        1859507
      2001          4        1748785
      2001          5        1820314
      2001          6        1573411
      2001          7        1723240
      2001          8        1486941
      2001          9        1603698
      2001         10        1596606
      2001         11        1548150
      2001         12        1639472
      2001 <null>           19761902
<null>     <null>           59285706
1.1 部分rollup:group by + 分組列 rollup(分組列表)
group by year ,rollup (month) 相當於
group by year ,month
union
group year;
  1  select year,month,sum(tot_sales) from all_orders
  2* group by year, rollup(month)
TEST@orcl> /
 
      YEAR      MONTH SUM(TOT_SALES)
---------- ---------- --------------
      2000          1        2997866
      2000          2        3325690
      2000          3        3719014
      2000          4        3497570
      2000          5        3640628
      2000          6        3146822
      2000          7        3446480
      2000          8        2973882
      2000          9        3207396
      2000         10        3193212
      2000         11        3096300
      2000         12        3278944
      2000 <null>           39523804
      2001          1        1498933
      2001          2        1662845
      2001          3        1859507
      2001          4        1748785
      2001          5        1820314
      2001          6        1573411
      2001          7        1723240
      2001          8        1486941
      2001          9        1603698
      2001         10        1596606
      2001         11        1548150
      2001         12        1639472
      2001 <null>           19761902
2.CUBE:cube類似於rollup,但產生的分組是分組類表的排列組合
SELECT  . . . 
FROM  . . . 
GROUP BY CUBE (list of grouping columns)
cube(year,month) 相當於
group by year,month
union
group by year
union
group by month
unin
group by null;
例子:
  1  select year,month,sum(tot_sales) from all_orders
  2* group by cube(year,month)
TEST@orcl> /
      YEAR      MONTH SUM(TOT_SALES)
---------- ---------- --------------
<null>     <null>           59285706
<null>              1        4496799
<null>              2        4988535
<null>              3        5578521
<null>              4        5246355
<null>              5        5460942
2.1 部分CUBE group by 分組列,cube(分組列表)
group by 后面的分組列可以看做一個固定列
3.GROUPING 函數,rollup和cube分組輸出的結果是多級分組的,grouping函數能區分分組的級別。例如:
  1  select year,month,grouping(year) g_year,grouping(month) g_month from all_orders
  2* group by rollup(year,month)
TEST@orcl> /
      YEAR      MONTH     G_YEAR    G_MONTH
---------- ---------- ---------- ----------
      2000          1          0          0
      2000          2          0          0
      2000          3          0          0
      2000          4          0          0
      2000          5          0          0
      2000          6          0          0
      2000          7          0          0
      2000          8          0          0
      2000          9          0          0
      2000         10          0          0
      2000         11          0          0
      2000         12          0          0
      2000 <null>              0          1
      2001          1          0          0
      2001          2          0          0
      2001          3          0          0
      2001          4          0          0
      2001          5          0          0
      2001          6          0          0
      2001          7          0          0
      2001          8          0          0
      2001          9          0          0
      2001         10          0          0
      2001         11          0          0
      2001         12          0          0
      2001 <null>              0          1
<null>     <null>              1          1
grouping(分組列) 返回0或1,0:代表該分組列參加分組 1:不參加分組,grouping主要用在格式化輸出 例如:
  1  select decode(grouping(year),1,'整年',year) year,decode(grouping(month),1,'整月',month) month
  2  from all_orders
  3* group by rollup(year,month)
TEST@orcl> /
YEAR                                     MONTH
---------------------------------------- ----------------------------------------
2000                                     1
2000                                     2
2000                                     3
2000                                     4
2000                                     5
2000                                     6
2000                                     7
2000                                     8
2000                                     9
2000                                     10
2000                                     11
2000                                     12
2000                                     整月
2001                                     1
2001                                     2
2001                                     3
2001                                     4
2001                                     5
2001                                     6
2001                                     7
2001                                     8
2001                                     9
2001                                     10
2001                                     11
2001                                     12
2001                                     整月
整年                                     整月
4.grouping sets:類似於rollup和cube
grouping sets(year,monh) 相當於
group by year
union
group by month
例如:
  1  select decode(grouping(year),1,'整年',year) year,decode(grouping(month),1,'整月',month) month
  2  from all_orders
  3* group by grouping sets(year,month)
TEST@orcl> /
YEAR                                     MONTH
---------------------------------------- ----------------------------------------
整年                                     1
整年                                     11
整年                                     6
整年                                     2
整年                                     4
整年                                     5
整年                                     8
整年                                     3
整年                                     7
整年                                     10
整年                                     12
整年                                     9
2001                                     整月
2000                                     整月
5.GROUP_ID和GROUPING_ID函數
 5.1 GROUPING_ID函數:
  語法:
SELECT  . . .  , GROUPING_ID(ordered_list_of_grouping_columns)
FROM  . . . 
GROUP BY  . . .
grouping_id函數和grouping函數相關聯的,grouping函數返回的是0或者1,grouping_id 返回的就是對應列的grouping的值然后再組合,最后轉換成十進制。例如:
  1  select year,month,grouping(year) g_year,grouping(month) g_month  from all_orders
  2   where year=2000
  3*  group by rollup(year,month)
SQL> /
 
      YEAR      MONTH     G_YEAR    G_MONTH
---------- ---------- ---------- ----------
      2000          1          0          0
      2000          2          0          0
      2000          3          0          0
      2000          4          0          0
      2000          5          0          0
      2000          6          0          0
      2000          7          0          0
      2000          8          0          0
      2000          9          0          0
      2000         10          0          0
      2000         11          0          0
      YEAR      MONTH     G_YEAR    G_MONTH
---------- ---------- ---------- ----------
      2000         12          0          0
      2000                     0          1
                               1          1
grouping_id(year,month)就是將G_YEAR和G_MONTH的值用||連接起來,因為grouping返回的0或1,可以看出是2進制,最終的結果會以十進制展示,例如:
 
  1  select year,month,grouping(year) g_year,grouping(month) g_month,grouping_id(year,month) g_y_m,
  2  grouping_id(month,year) g_m_y  from all_orders
  3   where year=2000
  4*  group by rollup(year,month)
SQL> /
 
      YEAR      MONTH     G_YEAR    G_MONTH      G_Y_M      G_M_Y
---------- ---------- ---------- ---------- ---------- ----------
      2000          1          0          0          0          0
      2000          2          0          0          0          0
      2000          3          0          0          0          0
      2000          4          0          0          0          0
      2000          5          0          0          0          0
      2000          6          0          0          0          0
      2000          7          0          0          0          0
      2000          8          0          0          0          0
      2000          9          0          0          0          0
      2000         10          0          0          0          0
      2000         11          0          0          0          0
 
      YEAR      MONTH     G_YEAR    G_MONTH      G_Y_M      G_M_Y
---------- ---------- ---------- ---------- ---------- ----------
      2000         12          0          0          0          0
      2000                     0          1          1          2
                               1          1          3          3
其作用可以用來過濾返回的分組級別。
 5.2 GROUP_ID
  語法:
SELECT  . . .  , GROUP_ID( )
FROM  . . . 
GROUP BY  . . .
group_id 分組可以識別哪些是重復的分組,唯一的分組返回0,例如:
 1  select year,month,grouping(year) g_year,grouping(month) g_month,group_id() g from all_orders
 2   where year=2000
 3*  group by year ,rollup(year,month)
QL> /
 
     YEAR      MONTH     G_YEAR    G_MONTH          G
--------- ---------- ---------- ---------- ----------
     2000          1          0          0          0
     2000          2          0          0          0
     2000          3          0          0          0
     2000          4          0          0          0
     2000          5          0          0          0
     2000          6          0          0          0
     2000          7          0          0          0
     2000          8          0          0          0
     2000          9          0          0          0
     2000         10          0          0          0
     2000         11          0          0          0
 
     YEAR      MONTH     G_YEAR    G_MONTH          G
--------- ---------- ---------- ---------- ----------
     2000         12          0          0          0
     2000                     0          1          0
     2000                     0          1          1
可以用 HAVING GROUP_ID() < 1過濾掉重復的分組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM