最近更新: 2006-10-24

分組統計的二種查詢敘述

使用 inner join 和 sum() 統計進貨數量。由於要進行分組合計,遂有兩種可行且結果相同的查詢敘述。但這兩種查詢敘述的 explain 和效能有所差異,視資料庫系統的查詢引擎而定。

有兩份 data table , pos110 為商品主檔, pos803 為進貨明細。

pos110 (商品主檔)
條碼 品名 單位
uno name unit
471321654 好吃速食麵1
471321613 好吃速食麵2
471321625 好吃速食麵3
pos803 (進貨單)
條碼 供應商代號 成本 建議售價 配置店號 進貨量 進貨單號 下單時間
uno supp_id cost list_price cno qty tr_no tr_date
471321654 A654 7.5 12.0 K0201 120 C200610200023 2006-10-20 10:23:21
471321654 A654 7.0 12.0 K0201 150 C200602110002 2006-02-11 11:32:11
471321654 A654 7.2 12.0 K0202 100 C200507010001 2005-07-01 16:32:21
471321613 A654 7.5 12.0 K0201 120 C200610200023 2006-10-20 10:23:21
471321613 A654 7.2 12.0 K0202 100 C200507010001 2005-07-01 16:32:21
471321625 A412 8.0 12.0 K0201 120 C200610200023 2006-10-20 10:23:21

Method 1: 不使用子查詢

全部聯結後再行統計與條件篩選。

SELECT pos110.uno, pos110.name, pos803.cost, pos110.unit, sum(pos803.qty) as total_qty
FROM pos110
INNER JOIN pos803
ON pos803.uno = pos110.uno
WHERE cno >= 'K0201' AND cno <= 'K0205'
GROUP BY pos110.uno, pos110.name, pos803.cost, pos110.unit;
&nbsp;

Method 2: 使用子查詢

先以子查詢統計與篩選進貨明細後,再將統計結果與商品主檔聯結。

SELECT pos110.uno, pos110.name, carry.cost, pos110.unit, carry.total_qty FROM pos110
INNER JOIN (
	SELECT pos803.uno, pos803.cost, sum(pos803.tqy) as total_qty
	FROM pos803
	WHERE cno >= 'K0201' AND cno <= 'K0205'
	GROUP BY pos803.uno, pos803.cost
) AS carry
ON pos110.uno = carry.uno;
&nbsp;

許多分組統計的案例都會出現上述的查詢方法選擇,不同的資料庫系統查詢引擎會有不同的處理方式,且相關表格的記錄數量亦會影嚮處理效率,故效能差異視實際情況而定,應運用查詢分析工具 (query analyzer) 進行調整。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/2357655.html