首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 分析函數 OVER() 子句完整範例教學

     編輯:Oracle 資料庫基礎

環境與測試資料

Windows 2000 + Oracle 8.1.7,使用內建 SCOTT.EMP 表(14 筆員工資料,含 DEPTNO、ENAME、SAL)。

基礎語法對照

寫法含義
SUM(sal) OVER ()全表總和,等同 SUM(sal)。
SUM(sal) OVER (ORDER BY ename)依 ENAME 排序的累加和(Running Total)。
SUM(sal) OVER (PARTITION BY deptno ORDER BY ename)各部門內依 ENAME 的分區累加和。
SUM(sal) OVER (PARTITION BY deptno)各部門總和(同部門每列相同)。
SUM(sal) OVER (ORDER BY deptno, ename)跨部門連續累加和。

實際查詢與結果解讀

SELECT deptno, ename, sal,
  SUM(sal) OVER (ORDER BY ename)              AS 連續求和,
  SUM(sal) OVER ()                            AS 總和,
  100*ROUND(sal/SUM(sal) OVER (),4)           AS "份額(%)",
  SUM(sal) OVER (PARTITION BY deptno ORDER BY ename) AS 部門連續求和,
  SUM(sal) OVER (PARTITION BY deptno)         AS 部門總和,
  100*ROUND(sal/SUM(sal) OVER (PARTITION BY deptno),4) AS "部門份額(%)"
FROM emp
ORDER BY deptno, ename;

關鍵觀察

  • 無 PARTITION:ORDER BY 決定累加方向,預設 RANGE UNBOUNDED PRECEDING。
  • 有 PARTITION:每個分區獨立計算,適合「各群組內排名/累加/佔比」場景。
  • ROUND(sal/SUM(...) OVER (...),4) 可直接算百分比,免去自連接或子查詢。

進階應用提示

  • 搭配 ROW_NUMBER()、RANK()、DENSE_RANK() 做 Top-N 查詢。
  • 窗格子句 ROWS BETWEEN ... 可控制滑動視窗大小(移動平均等)。
  • 8i 以上版本皆支援,10g+ 新增 IGNORE NULLS、RESPECT NULLS 等細節控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved