Oracle中的groupbyrollup學習

2022-04-09 08:18:56 字數 1658 閱讀 3278

oracle中的groupbyrollup學習。之前只知道group by可以進行分組,今天才知道原來還有個group by roolup函式,它可以對資料進行作和計算,在一些**運營平台做資料統計時就很實用呀。

要了解group by rollup的用法就要先與group by作下對比,我們可以通過scott模式中的emp表進行簡單資料查詢,以作比較。

scott.emp表中的depno,job,sal列的資訊如下:

select deptno, job, sal from scott.emp;

對上述資訊作group by查詢,結果如下:

select deptno, job , sum(sal) from scott.emp group deptno, job;

對資訊作group by rollup 查詢,結果如下:

select deptno, job , sum(sal) from scott.emp group by rollup(deptno, job);

可以看出資料庫對除了對deptno,job列進行分組外,還對sal列進行的了數值合計的運算。

1230 + 2450 + 5000 = 8750

8750 + 10875 + 9400 = 29025

實用擴充套件

在應用方面,對一些資料統計分析整合還是很方便的,比如根據下面的乙個需求,可以作乙個更複雜一些的查詢。

需求:查詢今日訂單、昨日訂單、今日手機訂單、昨日手機訂單,並且按小時統計:

/*想要乙個sql 能看出今日訂單昨日訂單今日手機訂單昨日手機訂單 並且按小時統計手機包括app和h5*/

select

nvl(t.hour,'總計') hour,

sum(case when day='today' then 1 else 0 end) 今日訂單,

sum(case when day='yesterday' then 1 else 0 end) 昨日訂單,

sum(case when day='today' and type='mobi' then 1 else 0 end) 今日手機,

sum(case when day='yesterday' and type='mobi' then 1 else 0 end) 昨日手機

from ( select

case when o.createdatetime>=trunc(sysdate)

then 'today' else 'yesterday' end as day,

case when o.ordertypeid in (40,42,44,113,110,119,120,41,

43,45,114,111,112,31,107,117,118,86,103)

then 'mobi' else 'pc' end as type,

o.id

from t_order o

where o.createdatetime>=trunc(sysdate)-1

and not exists (select 1 from t_dynastate n

where n.objid=o.id

and n.objtype=102

and n.statetypeid=1

and n.statevalueid=1

) tgroup by rollup(t.hour)

Oracle的group by分組,子句增強

開篇還是想吐槽一下這個oracle的group by分組,沒有mysql那麼好用,可能是mysql用習慣了 create table employees employee id number 8 notnull 員工id manager id number 6 經理id salary number ...

Oracle高階查詢之GROUP BY

為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的,很快就能寫出sql語句,如下 sql view plain copy select deptno,j...

Oracle高階查詢之GROUP BY

對於group by 的方式不再累贅,高階方式如下案例。為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。所用emp表,如果沒有此表請參考文章 中拷貝 現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的...