1. 程式人生 > >Oracle 高階查詢sql DECODE函式 分組函式

Oracle 高階查詢sql DECODE函式 分組函式

計算職位的人數,其中,“ANALYST”和“MANAGER”職位用“VIP”表示,其餘是普通員工,職位用“OPERATION”顯示。分別計算VIP職位和普通職員職位的人數,資料顯示效果如圖-1所示。

步驟一:使用DECODE函式,按要求顯示資料

使用DECODE函式,計算職位的人數,“ANALYST”和“MANAGER”職位用“VIP”表示,其餘是普通員工,職位用“OPERATION”表示。分別計算VIP職位和普通職員職位的人數,SQL語句如下所示:

  1. SELECT DECODE(job,
  2. 'ANALYST', 'VIP',
  3. 'MANAGER', 'VIP',
  4. 'OPERATION') job,
  5. COUNT(1) job_cnt
  6. FROM emp
  7. GROUP BY DECODE
    (job, 'ANALYST', 'VIP', 'MANAGER', 'VIP', 'OPERATION');

使用DECODE函式實現自定義排序

使用DECODE函式,將dept表中的資料按”OPERATIONS”、“ACCOUNTING”、“SALES”進行自定義排序,SQL語句如下所示:

  1. SELECT deptno, dname, loc
  2. FROM dept
  3. ORDER BY
  4. DECODE(dname, 'OPERATIONS',1,'ACCOUNTING',2,'SALES',3);

步驟三:使用ROW_NUMBER函式實現分組排序

使用ROW_NUMBER函式按照部門編碼分組顯示,每組內按職員編碼排序,並賦予組內編碼,SQL語句如下所示:

  1. SELECT deptno, ename, empno,
  2. ROW_NUMBER()
  3. OVER (PARTITION BY deptno ORDER BY empno) AS emp_id
  4. FROM emp;

ROW_NUMBER函式計算的值就表示每組內部排序後的順序編號,組內連續且唯一。

步驟四:使用RANK函式實現分組排序

使用RANK函式將職員表中按照部門編碼分組,同組內按薪水降序排列,相同薪水則按獎金數升序排列,並顯示等級標識,用Rank_ID表示,SQL語句如下所示:

  1. SELECTdeptno, ename, sal, comm,
  2. RANK() OVER (PARTITIONBYdeptno
  3. ORDERBYsalDESC, comm) "Rank_ID"
  4. FROMemp;

RANK函式排序後的等級標識是跳躍的,即如果有相同資料,則排名相同,比如並列第二,則兩行資料都標記為2,但下一位將是第四名。

步驟五:使用DENSE_RANK函式實現分組排序

關聯emp和dept表,使用DENSE_RANK函式,按照部門編碼分組,每組內按照員工薪水升序排列,列出員工的部門名字、姓名和薪水及等級drank,SQL語句如下所示:

  1. SELECTd.dname, e.ename, e.sal,
  2. DENSE_RANK()
  3. OVER (PARTITIONBYe.deptnoORDERBYe.sal)
  4. ASdrank
  5. FROMempejoindeptd
  6. one.deptno = d.deptno;

DENSE_RANK函式排序後的等級標識是連續的,即如果有並列第二,下一個排序將是三,這一點是和RANK函式不同,RANK是跳躍排序。

使用ROLLUP函式統計2010-2011年每月每日的銷售額,SQL語句如下所示:

  1. SELECT year_id, month_id, day_id, SUM(sales_value) AS sales_value
  2. FROM sales_tab
  3. GROUP BY ROLLUP (year_id, month_id, day_id)
  4. ORDER BY year_id, month_id, day_id;

上述SQL語句會依次按照(year_id, month_id, day_id)分組、(year_id, month_id)分組、(day_id)分組以及全表分組。

使用CUBE函式統計年月的銷售額,SQL語句如下所示:

  1. SELECT year_id, month_id,
  2. SUM(sales_value) AS sales_value
  3. FROM sales_tab
  4. GROUP BY CUBE (year_id, month_id)
  5. ORDER BY year_id, month_id;

上述SQL語句會依次按照(year_id, month_id)分組、(year_id)分組、(month_id)分組以及全表分組。

步驟八:使用GROUPING SETS函式統計銷售額

使用GROUPING SETS函式統計年月的銷售額,SQL語句如下所示:

  1. SELECT year_id, month_id, SUM(sales_value)
  2. FROM sales_tab
  3. GROUP BY GROUPING SETS ((year_id), (month_id))
  4. order by 1, 2;

上述SQL語句會依次按照(year_id)分組、(month_id)分組。