select * from test
1 00 001 大 5 15
2 00 001 中 25 75
3 00 001 小 85 25
4 00 002 大 65 35
5 00 002 中 95 85
6 00 002 小 85 25
7 01 001 大 16 14
8 01 001 中 290 75
9 01 001 小 83 22
SELECT num
,flg
,(CASE WHEN GROUPING(num)=1 THEN 'TOTAL'
WHEN GROUPING(type)=1 THEN 'SUBTOTAL'
ELSE type
END)
,sum(number1)
,sum(number2)
FROM test
GROUP BY ROLLUP(num,flg,type)
ORDER BY num NULLS LAST,flg,DECODE(type,'大',1,'中',2,'小',3,4);
1 00 001 大 5 15
2 00 001 中 25 75
3 00 001 小 85 25
4 00 001 SUBTOTAL 115 115
5 00 002 大 65 35
6 00 002 中 95 85
7 00 002 小 85 25
8 00 002 SUBTOTAL 245 145
9 00 SUBTOTAL 360 260
10 01 001 大 16 14
11 01 001 中 290 75
12 01 001 小 83 22
13 01 001 SUBTOTAL 389 111
14 01 SUBTOTAL 389 111
15 TOTAL 749 371
摘自 http://www.cnblogs.com/gkl0818/archive/2009/03/13/1410227.html--------------------------------------------------------------------------------
Oracle資料庫中的rollup配合group by命令使用,可以提供資訊匯總功能(與"小計"相似)
樣本如下:
SQL> select job,deptno,sal from emp;
JOB DEPTNO SAL
--------- --------- ---------
CLERK 20 800
SALESMAN 30 1600
SALESMAN 30 1250
MANAGER 20 2975
SALESMAN 30 1250
MANAGER 30 2850
MANAGER 10 2450
ANALYST 20 3000
PRESIDENT 10 5000
SALESMAN 30 1500
CLERK 20 1100
CLERK 30 950
ANALYST 20 3000
CLERK 10 1300
已選擇14行。
SQL> select job,deptno,sum(sal) total_sal from emp group by rollup(job,deptno);
JOB DEPTNO TOTAL_SAL
--------- --------- ---------
ANALYST 20 6000
ANALYST 6000
CLERK 10 1300
CLERK 20 1900
CLERK 30 950
CLERK 4150
MANAGER 10 2450
MANAGER 20 2975
MANAGER 30 2850
MANAGER 8275
PRESIDENT 10 5000
PRESIDENT 5000
SALESMAN 30 5600
SALESMAN 5600
29025
已選擇15行。
SQL>
--------------------------------------------------------------------------------
可以看出,
用了rollup的group by子句所產生的所謂的超級彙總就是指在在產生彙總時會從右向左逐個對每一列進行小結,並在結果中產生獨立的一行,同時也會對彙總列產生一個合計列。
例如在scott使用者下面有一個emp表:
select deptno,job,sum(sal) from emp group by deptno,job;
會對每一個不同的dept,job產生一行獨立的結果。
而
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
的結果中除了上述的結果結果之外,還會對每一個deptno進行一個小結,並單獨產生一行,除此之外還會對所有的sal求和並產生一列。
這裡的group by後面我們僅僅接了2列,實際上我們可以使用更多列的,這樣的話oracle就會以從右向左的方式來進行逐個小結。
這裡需要注意的是是使用了group by和rollup後,其後面的列要用括弧括起來,否則將會出現ORA-00933: SQL 命令未正確結束的錯誤。
rollup的這個用法在我們做一些複雜的中國式報表時還是能大有用武之地的。