SQL 聚合函數運算:在查詢中進行計算與應用

Published February 25, 2025 by 徐培鈞
資料庫

在 SQL 查詢中,聚合函數(Aggregate Functions) 主要用於對多筆數據進行統計運算,例如 COUNT() 計算筆數、SUM() 計算總和、AVG() 計算平均值等。

然而,許多初學者在使用 SQL 時,可能會忽略一個強大的技巧:可以在同一次查詢中對聚合函數的結果進行加減乘除運算,從而得到更進一步的分析結果。例如:

SELECT COUNT(CITY) - COUNT(DISTINCT CITY)
FROM STATION;

這條查詢的結果,告訴我們有多少個 CITY 是重複的。

本篇文章將詳細介紹 如何在 SQL 查詢中運算聚合函數的結果,並提供幾種常見的應用場景,幫助你提升 SQL 查詢的靈活度與數據處理能力。


基本概念:聚合函數運算

通常,我們使用 SQL 聚合函數來對數據進行彙總,例如:

SELECT COUNT(*) FROM orders; -- 計算訂單總數
SELECT SUM(price) FROM orders; -- 計算所有訂單的總金額

但我們也可以將這些函數的結果進行加減乘除,例如:

SELECT SUM(price) / COUNT(*) FROM orders; -- 計算平均訂單金額

這樣的運算方式,能夠讓我們在查詢中直接獲取更有價值的資訊,而不需要將結果匯出到程式中再計算。


具體應用範例

計算重複值數量

假設我們有一個 STATION 表:

CITYNew York
CITYLos Angeles
CITYChicago
CITYNew York
CITYSan Francisco
CITYChicago

如果我們想知道有多少個 CITY 是重複的,可以使用:

SELECT COUNT(CITY) - COUNT(DISTINCT CITY) AS DuplicateCities
FROM STATION;

🔹 結果:

🔍 解釋:

  • COUNT(CITY): 計算 CITY 欄位中的總筆數(包括重複的)。
  • COUNT(DISTINCT CITY): 計算 CITY 欄位中唯一的城市數量。
  • 相減後的結果 就是重複出現的城市數量

計算不同類別的比例

假設我們有一個 Orders 表:

CustomerID101
Amount500
CustomerID102
Amount300
CustomerID103
Amount700
CustomerID101
Amount200
CustomerID104
Amount600

如果我們想知道 單筆訂單平均金額與所有訂單總金額的比例

SELECT (AVG(Amount) / SUM(Amount)) * 100 AS Percentage
FROM Orders;

🔹 結果:

🔍 解釋:

  • AVG(Amount): 計算每筆訂單的平均金額。
  • SUM(Amount): 計算所有訂單的總金額。
  • 相除後乘以 100,得到每筆訂單的金額占比。

計算總數與特定條件數的比率

如果我們有一個 Users 表:

NameAlice
Age25
NameBob
Age30
NameCharlie
Age17
NameDavid
Age22
NameEve
Age19

現在我們想知道 成年(年齡 >= 18)的用戶比例

SELECT 
    (COUNT(CASE WHEN Age >= 18 THEN 1 END) * 1.0 / COUNT(*)) * 100 AS AdultPercentage
FROM Users;

🔹 結果:

🔍 解釋:

  • COUNT(CASE WHEN Age >= 18 THEN 1 END): 只統計年齡 >= 18 的用戶數。
  • COUNT(*): 計算所有用戶數。
  • 相除後乘以 100,得到成年用戶的百分比。

計算兩組數據的差異

假設我們有一個 Sales 表:

Year2023
Revenue500000
Year2024
Revenue600000

如果我們想要計算 2024 年的營收增長率:

SELECT 
    ((MAX(CASE WHEN Year = 2024 THEN Revenue END) - MAX(CASE WHEN Year = 2023 THEN Revenue END)) * 1.0
    / MAX(CASE WHEN Year = 2023 THEN Revenue END)) * 100 AS RevenueGrowth
FROM Sales;

🔹 結果:

🔍 解釋:

  • MAX(CASE WHEN Year = 2024 THEN Revenue END): 取得 2024 年的營收。
  • MAX(CASE WHEN Year = 2023 THEN Revenue END): 取得 2023 年的營收。
  • 相減後除以 2023 年營收,再乘以 100,計算出增長率。

使用 WITH 來簡化查詢

當查詢變得複雜時,可以使用 WITH(Common Table Expression,CTE) 來簡化結構。例如:

WITH RevenueData AS (
    SELECT 
        Year,
        SUM(Revenue) AS TotalRevenue
    FROM Sales
    GROUP BY Year
)
SELECT 
    ((MAX(CASE WHEN Year = 2024 THEN TotalRevenue END) - 
      MAX(CASE WHEN Year = 2023 THEN TotalRevenue END)) * 1.0 
    / MAX(CASE WHEN Year = 2023 THEN TotalRevenue END)) * 100 AS RevenueGrowth
FROM RevenueData;

這樣的寫法更清晰,也更易於維護。


結語

SQL 的聚合函數不只是用來計算總數、總和或平均值,我們還可以進一步透過數學運算來獲取更有價值的數據,例如:

  • 計算重複值數量
  • 求比率(例如訂單占比、年齡分布)
  • 計算增長率
  • 比較不同數據組的統計結果

透過這些技巧,你可以更靈活地運用 SQL 進行數據分析,讓你的查詢結果更具商業價值!🚀