ORACLE GROUPING函式的使用

2022-01-31 19:03:24 字數 4755 閱讀 6104

grouping函式可以接受一列,返回0或者1。如果列值為空,那麼grouping()返回1;如果列值非空,那麼返回0。grouping只能在使用rollup或cube的查詢中使用。當需要在返回空值的地方顯示某個值時,grouping()就非常有用。

1、在rollup中對單列使用grouping()

sql>

select division_id,sum

(salary)

2from

employees2

3group

byrollup(division_id)

4order

bydivision_id;

div

sum(salary)

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

bus 1610000

ope

1320000

sal

4936000

sup

1015000

8881000

加上grouping來看看

sql>

select

grouping(division_id),division_id,sum

(salary)

2from

employees2

3group

byrollup(division_id)

4order

bydivision_id;

grouping(division_id) div sum

(salary)

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

0 bus 1610000

0 ope 1320000

0 sal 4936000

0 sup 1015000

18881000

可以看到,為空的地方返回1,非空的地方返回0。

2、使用case轉換grouping()的返回值

可能你會覺得前面的0和1太枯燥了,代表不了任何意義,說白了就是不夠人性化,呵呵。這個時候我們可以使用case來轉換為一些有意義的值。

sql>

select

2case

grouping

(division_id)

3when

1then

'all divisions'4

else

division_id

5end

asdiv,

6sum

(salary)

7from

employees2

8group

byrollup(division_id)

9order

bydivision_id;

div

sum(salary)

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

bus 1610000

ope

1320000

sal

4936000

sup

1015000

all divisions 8881000

3、使用case和grouping()轉換多個列的值

sql>

select

2case

grouping

(division_id)

3when

1then

'all divisions'4

else

division_id

5end

asdiv,

6case

grouping

(job_id)

7when

1then

'all jobs'8

else

job_id

9end

asjob,

10sum

(salary)

11from

employees2

12group

byrollup(division_id,job_id)

13order

bydivision_id,job_id;

div job

sum(salary)

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

bus mgr 530000

bus pre

800000

bus wor

280000

bus

all jobs 1610000

ope eng

245000

ope mgr

805000

ope wor

270000

ope

all jobs 1320000

sal mgr

4446000

sal wor

490000

sal

all jobs 4936000

div job

sum(salary)

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

sup mgr 465000

sup tec

115000

sup wor

435000

sup

all jobs 1015000

all divisions all jobs 8881000

16 rows selected.

4、cube與grouping()結合使用

sql>

select

2case

grouping

(division_id)

3when

1then

'all divisions'4

else

division_id

5end

asdiv,

6case

grouping

(job_id)

7when

1then

'all jobs'8

else

job_id

9end

asjob,

10sum

(salary)

11from

employees2

12group

bycube(division_id,job_id)

13order

bydivision_id,job_id;

div job

sum(salary)

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

bus mgr 530000

bus pre

800000

bus wor

280000

bus

all jobs 1610000

ope eng

245000

ope mgr

805000

ope wor

270000

ope

all jobs 1320000

sal mgr

4446000

sal wor

490000

sal

all jobs 4936000

div job

sum(salary)

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

sup mgr 465000

sup tec

115000

sup wor

435000

sup

all jobs 1015000

all divisions eng 245000

all divisions mgr 6246000

all divisions pre 800000

all divisions tec 115000

all divisions wor 1475000

all divisions all jobs 8881000

21 rows selected.

5、使用grouping sets子句

使用grouping sets子句可以只返回小計記錄。

sql>

select division_id,job_id,sum

(salary)

2from

employees2

3group

bygrouping

sets(division_id,job_id)

4order

bydivision_id,job_id;

div job

sum(salary)

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

bus 1610000

ope

1320000

sal

4936000

sup

1015000

eng

245000

mgr

6246000

pre

800000

tec

115000

wor

1475000

9 rows selected.

ORACLE GROUPING函式的使用

grouping函式可以接受一列,返回0或者1。如果列值為空,那麼grouping 返回1 如果列值非空,那麼返回0。grouping只能在使用rollup或cube的查詢中使用。當需要在返回空值的地方顯示某個值時,grouping 就非常有用。關於rollup和cube函式的使用,請參見我的另一篇...

ORACLE GROUPING函式的使用

grouping函式可以接受一列,返回0或者1。如果列值為空,那麼grouping 返回1 如果列值非空,那麼返回0。grouping只能在使用rollup或cube的查詢中使用。當需要在返回空值的地方顯示某個值時,grouping 就非常有用。關於rollup和cube函式的使用,請參見我的另一篇...

WaitForSingleObject函式的使用

程式舉例 1 建立對話方塊應用程式,專案名稱為mytestthread 2 新增按鈕,命名為啟動和停止,在對話方塊中增加編輯框,id為idc time,3 增加成員變數,handle m hthread 2 此為執行緒的控制代碼 4 定義全域性變數,用來控制線程的執行與否 volatile bool...