Oracle group by 用法實例詳解

Group by的語法oracle

Select [filed1,fild2,]聚合函數(filed),ide

[Grouping(filed),]函數

[Grouping_id(filed1,filed2,…)]性能

From tablename測試

Where condition字體

[Group by {rollup|cube}(filed,filed2)]spa

[having condition]code

[order by filed1]排序

1、基本用法:

(1)咱們經過幾個例子來研究groupby的基本用法ci

建立測試表

SQL> create table sales(

2 empid number, --僱員ID

3 depid number, - -部門ID

4 area varchar(20), --區域

5 salenum number); --銷售額

 

表已建立。

 

SQL> insert into sales values(1,1,'china',10);

SQL> insert into sales values(2,1,'china',10);

SQL> insert into sales values(3,1,'china',10);

SQL> insert into sales values(3,1,'china',10);

SQL> insert into sales values(3,1,'china',10);

SQL> insert into sales values(1,1,'china',10);

SQL> insert into sales values(2,1,'china',10);

SQL> insert into sales values(4,2,'china',10);

SQL> insert into sales values(4,2,'china',10);

SQL> insert into sales values(5,3,'us',10);

SQL> insert into sales values(5,3,'us',10);

需求1,按部門統計銷售額 (簡單用法)

SQL> select depid,sum(salenum) from sales group by depid;

DEPID SUM(SALENUM)

---------- ------------

1        70

2        20

3        20

需求2,按部門統計銷售額,而且只顯示銷售總額小於30的部門及銷售額(使用having子句)

SQL> select depid,sum(salenum) totalnum from sales

group by depid

having sum(salenum) <30;

DEPID SUM(SALENUM)

---------- ------------

2        20

3        20

註解:需求2須要使用having字名,並且在子句中不能使用別名,必須使用在select語句中書寫的形式

(2)Where 和having的區別

Wheret和having子句都用來篩選數據,可是where是針對原數據進行篩選,而having子句只是針對彙總後的結果進行篩選,因此在需求二的例子中,想要對銷售總額進行過濾只能使用having子句

(3)使用order by 排序

SQL> select depid,sum(salenum) from sales group by depid;

DEPID SUM(SALENUM)

---------- ------------

1       70

2       20

3       20

注意觀察需求1的例子,depid是已經按照在depid升序排列的,這是由於oracle在作聚合統計的時候會首先對字段進行排序,因此最終的結果是按照升序進行排列的,若是order by後跟着多個字段,默認排序是先對第一個字段升序排序,而後再排第二個字段,以此類推,因此若是在應用中僅僅須要長序排序能夠不用加order by 參數,畢竟這會影響性能

2、擴展用法:

擴展用法使用下面的表進行實驗研究

SQL> create table testgroup(

2 a varchar(5),

3 b varchar(5),

4 c varchar(5),

5 n number);

建完測試表,而後插入兩條測試數據

SQL> insert into testgroup values('a1','b1','c1',10);

SQL> insert into testgroup values('a1','b1','c1',20);

咱們使用基本的group by 能夠獲得如下結果

SQL> select a,b,c,sum(n) total from testgroup group by a,b,c;

A        B      C     TOTAL

----- ----- ----- ----------

a1      b1     c1     30

(1)使用rollup操做符

Rollup意思有」捲起,彙總」的意思,他能夠在使得在其括號中的字段,按從右到左的順序分別group後顯示,相似咱們用多個group by 語句,而後union all起來,咱們把針對上面的測試表,使用rollup操做符,看看效果

SQL> select a,b,c,sum(n) total from testgroup group by rollup(a,b,c);

Result:

A B C TOTAL
a1 b1 c1 30
a1 b1   30
a1     30
      30

從上面結果能夠看出, 除了對(a1,b1,c1)進行了彙總外,又從右向左分別對子句中的」a,b,c」字段進行了彙總,例如(a1,b1),(a1) ()

(2)使用cube操做符

Cube意思是立方,使用該操做符能夠對操做符內的字段,進行遍歷組合彙總,例如cube(a,b,c),那麼就會產生8種組合結果,分別以下」a-b-c」,」a-b」,」a」,」a-c」,」 b-c」,」b」,」c」,」空」,看下面的例子

SQL> select a,b,c,sum(n) total from testgroup group by cube(a,b,c);

        Result:

A B C TOTAL
      30
    c1 30
  b1   30
  b1 c1 30
a1     30
a1   c1 30
a1 b1   30
a1 b1 c1 30

(3),使用grouping(filed)函數

使用grouping 函數必須先理解rollup 和cube操做符,那麼grouping函數有什麼用呢?在平常應用中,咱們經過rollup或者cube對彙總進行了彙總,彙總後的結果每每要傳送到應用程序端,在應用程序端咱們必需要有一個依據來判斷某行數據是否是按照rollup或cube進行彙總,grouping函數能夠用來產生這個依據,他能夠接收一個參數,判斷該參數是否爲null,是則返回1,不然返回0,我樣能夠據此來判斷該是否按某列進行彙總統計的,固然在實驗應用中,0和1看起來不那麼直觀,咱們可使用decode或者case函數進行轉議,讓查看結果看起來更直觀,請看如下例子

SQL> select grouping(a) ca,grouping(b) cb,grouping(c) cc, a,b,c,sum(n) from testgroup group by rollup(a,b,c);

Result:

CA CB CC A B C SUM(N)
0 0 0 a1 b1 c1 30
0 0 1 a1 b1   30
0 1 1 a1     30
1 1 1       30

(4)使用grouping_id(filed1,file2,…)函數

使用grouping函數有時候感受不是那麼靈活的,他只能接收一個字段,而grouping_id()函數則能夠接收多個字段,GROUPING_ID()函數能夠接受一列或多列,返回按GROUPING位向量進行計算的十進制值。下面咱們經過一個例子來研究grouping_id函數是如何按照grouping函數的位向量進行計算的。

SQL> select grouping(a) ca,grouping(b) cb,grouping_id(a,b) caandb, a,b,sum(n) from testgroup group by rollup(a,b);

Result:

CA CB CAANDB A B SUM(N)
0 0 0 a1 b1 30
0 1 1 a1   30
1 1 3     30

位向量計算方法:如上例,

第一行,CA=0,CB=0,那麼位向量就是「00」,換算成十進制是0

第二行,CA=0,CB=1,那麼位向量就是‘01’,換算成十進制是1

第三行,CA=1,CB=1,那麼位向量就是‘11’,換算成十進制是3

請注意上例中grouping_id的計算值跟括號內的字段順序有關,上例中書寫順序是grouping_id(a,b),a字段在前面,若是換下順序grouping_id(b,a),計算結果是不同的,看下例

SQL> select grouping(a) ca,grouping(b) cb,grouping_id(b,a) caandb, a,b,sum(n) from testgroup group by rollup(a,b);

Result:

CA CB CAANDB A B SUM(N)
0 0 0 a1 b1 30
0 1 2 a1   30
1 1 3     30

 

看看第二行紅色字體,grouping_id中的字段順序發生了變化,位向量值也不同了

(4-1) grouping_id()函數的用途

上面講了grouping_id的用法,但在平常工做中,咱們如何應用該函數呢?其實只要瞭解了他的原理及用法,要怎麼用,就看咱們是否能夠靈活使用了,下面介紹一種常見的用法:

假如咱們要對某testgroup進行分組統計,而且過濾掉不包括小計或總計的行,這時grouping_id就有用武之地了,咱們能夠利用grouping_id的值結合having子句,經過判斷grouping_id是否大於0來過濾掉不須要的行。

SQL> select grouping(a) ca,grouping(b) cb,grouping_id(a,b) caandb, a,b,sum(n) from testgroup group by rollup(a,b) having grouping_id(a,b)>0;

Result:

CA CB CAANDB A B SUM(N)
0 1 1 a1   30
1 1 3     30
相關文章
相關標籤/搜索