在 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 表:
| ID | CITY |
|---|---|
| 1 | New York |
| 2 | Los Angeles |
| 3 | Chicago |
| 4 | New York |
| 5 | San Francisco |
| 6 | Chicago |
CITYNew York
CITYLos Angeles
CITYChicago
CITYNew York
CITYSan Francisco
CITYChicago
如果我們想知道有多少個 CITY 是重複的,可以使用:
SELECT COUNT(CITY) - COUNT(DISTINCT CITY) AS DuplicateCities
FROM STATION;🔹 結果:
| DuplicateCities |
|---|
| 2 |
🔍 解釋:
COUNT(CITY): 計算CITY欄位中的總筆數(包括重複的)。COUNT(DISTINCT CITY): 計算CITY欄位中唯一的城市數量。- 相減後的結果 就是重複出現的城市數量。
計算不同類別的比例
假設我們有一個 Orders 表:
| OrderID | CustomerID | Amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
| 4 | 101 | 200 |
| 5 | 104 | 600 |
CustomerID101
Amount500
CustomerID102
Amount300
CustomerID103
Amount700
CustomerID101
Amount200
CustomerID104
Amount600
如果我們想知道 單筆訂單平均金額與所有訂單總金額的比例:
SELECT (AVG(Amount) / SUM(Amount)) * 100 AS Percentage
FROM Orders;🔹 結果:
| Percentage |
|---|
| 14.3% |
🔍 解釋:
AVG(Amount): 計算每筆訂單的平均金額。SUM(Amount): 計算所有訂單的總金額。- 相除後乘以 100,得到每筆訂單的金額占比。
計算總數與特定條件數的比率
如果我們有一個 Users 表:
| UserID | Name | Age |
|---|---|---|
| 1 | Alice | 25 |
| 2 | Bob | 30 |
| 3 | Charlie | 17 |
| 4 | David | 22 |
| 5 | Eve | 19 |
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;
🔹 結果:
| AdultPercentage |
|---|
| 80.0% |
🔍 解釋:
COUNT(CASE WHEN Age >= 18 THEN 1 END): 只統計年齡 >= 18 的用戶數。COUNT(*): 計算所有用戶數。- 相除後乘以 100,得到成年用戶的百分比。
計算兩組數據的差異
假設我們有一個 Sales 表:
| SalesID | Year | Revenue |
|---|---|---|
| 1 | 2023 | 500000 |
| 2 | 2024 | 600000 |
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;
🔹 結果:
| RevenueGrowth |
|---|
| 20.0% |
🔍 解釋:
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 進行數據分析,讓你的查詢結果更具商業價值!🚀