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

Oracle OVER() 分析函數實戰:累加、分組統計與佔比計算

     編輯:Oracle 資料庫基礎

核心概念

OVER() 子句將彙總函數(SUM、AVG、COUNT 等)轉為分析函數,不再縮減行數,而是為每一行計算基於「視窗」的彙總值。

語法結構

聚合函數(...) OVER (
  [PARTITION BY 分組欄位]
  [ORDER BY 排序欄位]
  [ROWS/RANGE BETWEEN ...]  -- 視窗框架,進階用法
)

範例資料:scott.emp 表

14 筆員工資料,含 deptno、ename、sal。

案例一:全表累加與佔比

SELECT deptno, ename, sal,
       SUM(sal) OVER (ORDER BY ename)        AS running_total,
       SUM(sal) OVER ()                      AS grand_total,
       ROUND(100 * sal / SUM(sal) OVER (), 2) AS pct_of_total
FROM emp;

關鍵差異:

  • OVER (ORDER BY ename):依名稱排序後逐行累加(Running Total)。
  • OVER ():無排序、無分組,等同全表總和(每行相同值)。

案例二:分組累加、分組總與分組佔比

SELECT deptno, ename, sal,
       SUM(sal) OVER (PARTITION BY deptno ORDER BY ename) AS dept_running,
       SUM(sal) OVER (PARTITION BY deptno)                AS dept_total,
       ROUND(100 * sal / SUM(sal) OVER (PARTITION BY deptno), 2) AS dept_pct,
       SUM(sal) OVER (ORDER BY deptno, ename)             AS global_running,
       SUM(sal) OVER ()                                   AS grand_total,
       ROUND(100 * sal / SUM(sal) OVER (), 2)             AS grand_pct
FROM emp;

結果解讀

deptnoenamesaldept_runningdept_totaldept_pctglobal_runninggrand_totalgrand_pct
10CLARK24502450875028.002450290258.44
10KING50007450875057.1474502902517.23
10MILLER13008750875014.868750290254.48
20ADAMS110011001087510.119850290253.79
20FORD300041001087527.59128502902510.34
20JONES297570751087527.36158252902510.25
20SCOTT3000100751087527.59188252902510.34
20SMITH80010875108757.3619625290252.76
30ALLEN16001600940017.0221225290255.51
30BLAKE28504450940030.3224075290259.82
30JAMES9505400940010.1125025290253.27
30MARTIN12506650940013.3026275290254.31
30TURNER15008150940015.9627775290255.17
30WARD12509400940013.3029025290254.31

常見應用場景

  • 累計銷售額:SUM(amt) OVER (PARTITION BY shop_id ORDER BY sale_date)
  • Top-N 分析:搭配 ROW_NUMBER() OVER (PARTITION BY dept ORDER BY sal DESC) 取各部門前 3 高薪。
  • 同比/環比:LAG(sal) OVER (PARTITION BY empno ORDER BY month) 取上月薪資。
  • 移動平均:AVG(sal) OVER (ORDER BY ename ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)

效能提示

  • 分析函數通常比自連接或子查詢效能優,因只需單次掃描+排序。
  • 大數據量時,PARTITION BY 欄位若有索引可避免排序開銷。
  • 避免在視窗框架使用 RANGE 搭配數值/日期型別,可能觸發昂貴的排序操作;優先用 ROWS。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved