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

Oracle 進階技巧:DECODE 行列轉換與常用窗口函數速查表

     編輯:Oracle 資料庫基礎

一、DECODE 實現行列轉換(樞紐分析)

將部門薪資總額由「列存」轉為「行存」顯示:

SELECT '工資' AS 部門,
       SUM(DECODE(k.deptno, '10', k.g)) AS 部門10,
       SUM(DECODE(k.deptno, '20', k.g)) AS 部門20,
       SUM(DECODE(k.deptno, '30', k.g)) AS 部門30,
       SUM(DECODE(k.deptno, '40', k.g)) AS 部門40
FROM (
  SELECT SUM(e.sal) g, e.deptno
  FROM emp e
  LEFT JOIN dept d ON d.deptno = e.empno
  GROUP BY e.deptno
) k;

原理: `DECODE` 充當條件加總器,配合 `SUM` 將符合條件的行聚合到對應欄位。11g+ 可改用標準 `PIVOT` 語法。

二、常用窗口函數速查表

函數語法範例用途關鍵字句
排序編號RANK() OVER (ORDER BY sal DESC)並列同名次,跳過下一名次 (1,2,2,4)ORDER BY
密集排序DENSE_RANK() OVER (ORDER BY sal DESC)並列同名次,不跳過 (1,2,2,3)ORDER BY
唯一行號ROW_NUMBER() OVER (ORDER BY sal DESC)1,2,3,4... 無並列,常用分頁/去重ORDER BY
分組聚合AVG(sal) OVER (PARTITION BY deptno)各部門平均薪資附掛每行PARTITION BY
滑動視窗-行SUM(sal) OVER (ORDER BY hiredate ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)當前行±1行薪資總和ROWS BETWEEN
滑動視窗-值COUNT(*) OVER (ORDER BY sal RANGE BETWEEN 100 PRECEDING AND 100 FOLLOWING)薪資差距±100 內的人數RANGE BETWEEN
首/尾值FIRST_VALUE(sal) OVER (PARTITION BY deptno ORDER BY sal)部門最低薪資PARTITION BY + ORDER BY
前後值LAG(sal, 1) OVER (ORDER BY hiredate)上一筆薪資(依入職日排序)OFFSET

三、窗口函數 vs 聚合函數關鍵差異

  • 窗口函數**不減少回傳行數**,每行保留明細並附加計算結果。
  • `OVER()` 子句定義「窗口」:`PARTITION BY` 分組、`ORDER BY` 排序、`ROWS/RANGE BETWEEN` 界定範圍。
  • `ROWS` 以物理行數計,`RANGE` 以 `ORDER BY` 運算式值計(需數值/日期型別)。

四、實戰範例:Top-N per Group

-- 取各部門薪資前 2 高員工
SELECT *
FROM (
  SELECT e.*, 
         ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) rn
  FROM emp e
) WHERE rn <= 2;

五、版本相容性提醒

  • Oracle 8i:僅支援 `ROW_NUMBER`、`RANK`、`DENSE_RANK`、`LAG`/`LEAD`、`FIRST_VALUE`/`LAST_VALUE`、`RATIO_TO_REPORT`。
  • Oracle 9i+:完整支援 `PARTITION BY`、`ROWS/RANGE BETWEEN` 等進階窗口語法。
  • 12c+:新增 `APPROX_COUNT_DISTINCT`、`APPROX_PERCENTILE` 等近似計算窗口函數。

結語

`DECODE` 行列轉換是舊版本樞紐分析利器,現代建議改用 `PIVOT`/`UNPIVOT`。窗口函數則是分析型 SQL 核心工具,掌握 `PARTITION BY`、`ORDER BY`、`ROWS/RANGE BETWEEN` 三大子句組合,即可解決 90% 的「同組比較、累計、移動平均、Top-N」需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved