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

SQL 單列多欄位求最大值技巧:使用 UNION ALL 搭配子查詢

     編輯:關於SqlServer

需求:在單一資料列中,找出多個數值欄位(如 A、B、C、D、E)的最大值,並忽略 NULL。傳統寫法需大量 CASE WHEN 或 IIF 巢狀,難以維護。本文介紹一種巧妙的 UNION ALL 子查詢寫法,將橫向欄位轉為縱向資料列,再套用 MAX() 聚合函數,程式碼簡潔且易擴充。

建立測試資料

CREATE TABLE T (
    A DECIMAL(10,1), B DECIMAL(10,1), C DECIMAL(10,1),
    D DECIMAL(10,1), E DECIMAL(10,1)
);

INSERT INTO T VALUES
(-21.5, -15.0, -5.0,  NULL,  NULL),
(-5.5,  -11.5,  NULL,  NULL,  NULL),
(-1.0,  -16.5, -10.5, NULL,  NULL);

核心查詢

SELECT *,
    Max_Value = (
        SELECT MAX(Val) FROM (
            SELECT A AS Val UNION ALL
            SELECT B UNION ALL
            SELECT C UNION ALL
            SELECT D UNION ALL
            SELECT E
        ) AS Tmp
    )
FROM T;

執行結果

ABCDEMax_Value
-21.5-15.0-5.0NULLNULL-5.0
-5.5-11.5NULLNULLNULL-5.5
-1.0-16.5-10.5NULLNULL-1.0

原理說明

  1. UNION ALL 將 5 個欄位逐列堆疊成單一欄位 Val 的虛擬資料表。
  2. 外層 MAX(Val) 自動忽略 NULL,取得最大值。
  3. 子查詢為相關子查詢,針對每一列獨立運算。

擴充與替代方案

SQL Server 2008+:使用 VALUES 建構子

SELECT *,
    (SELECT MAX(Val) FROM (VALUES (A),(B),(C),(D),(E)) AS V(Val)) AS Max_Value
FROM T;

語法更簡潔,效能相當。

SQL Server 2022 / Azure SQL:GREATEST 函數

SELECT *, GREATEST(A, B, C, D, E) AS Max_Value FROM T;

原生函數,最佳效能與可讀性。

動態欄位數量

若欄位數不固定,可搭配動態 SQL 組裝 UNION ALL 或 VALUES 子句。

效能提示

  • 欄位數 ≤ 10 時,UNION ALL / VALUES 成本極低。
  • 大量列(百萬筆以上)建議在應用層或 ETL 階段預先計算,避免逐列子查詢開銷。
  • 確保欄位資料型別一致,避免隱含轉換影響索引使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved