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表,如果沒有此表請參考文章 中拷貝 現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的...