Oracle 高階查詢sql DECODE函式 分組函式
步驟一:使用DECODE函式,按要求顯示資料
使用DECODE函式,計算職位的人數,“ANALYST”和“MANAGER”職位用“VIP”表示,其餘是普通員工,職位用“OPERATION”表示。分別計算VIP職位和普通職員職位的人數,SQL語句如下所示:
- SELECT DECODE(job,
- 'ANALYST', 'VIP',
- 'MANAGER', 'VIP',
- 'OPERATION') job,
- COUNT(1) job_cnt
- FROM emp
- GROUP BY DECODE
使用DECODE函式實現自定義排序
使用DECODE函式,將dept表中的資料按”OPERATIONS”、“ACCOUNTING”、“SALES”進行自定義排序,SQL語句如下所示:
- SELECT deptno, dname, loc
- FROM dept
- ORDER BY
- DECODE(dname, 'OPERATIONS',1,'ACCOUNTING',2,'SALES',3);
步驟三:使用ROW_NUMBER函式實現分組排序
使用ROW_NUMBER函式按照部門編碼分組顯示,每組內按職員編碼排序,並賦予組內編碼,SQL語句如下所示:
- SELECT deptno, ename, empno,
- ROW_NUMBER()
- OVER (PARTITION BY deptno ORDER BY empno) AS emp_id
- FROM emp;
ROW_NUMBER函式計算的值就表示每組內部排序後的順序編號,組內連續且唯一。
步驟四:使用RANK函式實現分組排序
使用RANK函式將職員表中按照部門編碼分組,同組內按薪水降序排列,相同薪水則按獎金數升序排列,並顯示等級標識,用Rank_ID表示,SQL語句如下所示:
- SELECTdeptno, ename, sal, comm,
- RANK() OVER (PARTITIONBYdeptno
- ORDERBYsalDESC, comm) "Rank_ID"
- FROMemp;
RANK函式排序後的等級標識是跳躍的,即如果有相同資料,則排名相同,比如並列第二,則兩行資料都標記為2,但下一位將是第四名。
步驟五:使用DENSE_RANK函式實現分組排序
關聯emp和dept表,使用DENSE_RANK函式,按照部門編碼分組,每組內按照員工薪水升序排列,列出員工的部門名字、姓名和薪水及等級drank,SQL語句如下所示:
- SELECTd.dname, e.ename, e.sal,
- DENSE_RANK()
- OVER (PARTITIONBYe.deptnoORDERBYe.sal)
- ASdrank
- FROMempejoindeptd
- one.deptno = d.deptno;
DENSE_RANK函式排序後的等級標識是連續的,即如果有並列第二,下一個排序將是三,這一點是和RANK函式不同,RANK是跳躍排序。
使用ROLLUP函式統計2010-2011年每月每日的銷售額,SQL語句如下所示:
- SELECT year_id, month_id, day_id, SUM(sales_value) AS sales_value
- FROM sales_tab
- GROUP BY ROLLUP (year_id, month_id, day_id)
- ORDER BY year_id, month_id, day_id;
上述SQL語句會依次按照(year_id, month_id, day_id)分組、(year_id, month_id)分組、(day_id)分組以及全表分組。
使用CUBE函式統計年月的銷售額,SQL語句如下所示:
- SELECT year_id, month_id,
- SUM(sales_value) AS sales_value
- FROM sales_tab
- GROUP BY CUBE (year_id, month_id)
- ORDER BY year_id, month_id;
上述SQL語句會依次按照(year_id, month_id)分組、(year_id)分組、(month_id)分組以及全表分組。
步驟八:使用GROUPING SETS函式統計銷售額
使用GROUPING SETS函式統計年月的銷售額,SQL語句如下所示:
- SELECT year_id, month_id, SUM(sales_value)
- FROM sales_tab
- GROUP BY GROUPING SETS ((year_id), (month_id))
- order by 1, 2;
上述SQL語句會依次按照(year_id)分組、(month_id)分組。