首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 進階查詢:分組統計與超過區域平均銷售額的記錄篩選

     編輯:程式設計綜合問答

業務場景

假設有一張銷售記錄表 sales,結構如下(主鍵 id、地區 region、銷售人員 sales、銷售金額 total):

銷售表結構示意圖
圖:主鍵-地區-銷售人員-銷售金額

需求:查詢出所有「銷售金額超過該地區平均銷售金額」的記錄。

解決思路

這是一個典型的「分組統計後關聯原表篩選」問題。核心步驟:

  1. 先按 region 分組,計算各地區的平均銷售額 AVG(total)。
  2. 將分組統計結果作為衍生表(或 CTE)與原表 JOIN,依地區關聯。
  3. 在 WHERE 條件中比較原表 total 與統計表的平均值。

標準 SQL 寫法

SELECT s.*
FROM sales s
JOIN (
    SELECT region, AVG(total) AS avg_total
    FROM sales
    GROUP BY region
) avg_t ON s.region = avg_t.region
WHERE s.total > avg_t.avg_total;

原答案寫法解析(舊式隱式連接)

SELECT 表名.* 
FROM 表名, 
     (SELECT AVG(total) t, region FROM 表名 GROUP BY region) ta 
WHERE 表名.region = ta.region 
  AND 表名.total > ta.t;

雖然語法較舊(使用逗號隱式連接),但邏輯完全正確:子查詢 ta 計算各區域平均值 t,主查詢關聯後篩選 total > t。

現代最佳實踐建議

  • 優先使用顯式 JOIN ... ON 語法,可讀性更強,避免笛卡兒積風險。
  • 大數據量場景下,確保 region 欄位有索引,子查詢結果集較小,通常性能良好。
  • 若資料庫支援窗口函數(MySQL 8.0+, PostgreSQL, SQL Server, Oracle),可更簡潔:
SELECT *
FROM (
    SELECT *, AVG(total) OVER (PARTITION BY region) AS avg_total
    FROM sales
) t
WHERE total > avg_total;

總結

掌握「子查詢分組統計 + 關聯篩選」模式,可輕鬆解決各類「超過群體平均/最大/最小值」的業務查詢需求。

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