oracle 中grouping

來源:互聯網
上載者:User

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的這個用法在我們做一些複雜的中國式報表時還是能大有用武之地的。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.