關聯式資料通常以正規化形式儲存,透過鍵值關聯資料表,避免重複儲存計算值,改在查詢時即時計算。若需分析「哪些產品訂單最多」或「哪些訂單利潤最高」,則需善用 GROUP BY 子句建立彙總查詢。
Northwind 是 SQL Server 內建的範例資料庫,雖不完美但足以示範 GROUP BY 應用。核心資料表包含 Customers(客戶)、Orders(訂單)、Order Details(訂單明細)、Products(產品)。
查詢各訂單的 OrderID 與 ProductID:
SELECT o.OrderID, od.ProductID
FROM Orders o, [Order Details] od
WHERE o.OrderID = od.OrderID
SELECT o.OrderID, Count(od.ProductID) as NumItems
FROM Orders o, [Order Details] od
WHERE o.OrderID = od.OrderID
執行會報錯:Msg 8118 — OrderID 未包含在彙總函式或 GROUP BY 中。因為我們要的是「依訂單統計商品種類數」,而非總筆數。
GROUP BY 解決「我要如何看資料?」的問題。若答案是「依某欄位分群」,即需用 GROUP BY。搭配 ORDER BY 可輕易找出商品最多的訂單:
SELECT o.OrderID, Count(od.ProductID) as NumItems
FROM Orders o, [Order Details] od
WHERE o.OrderID = od.OrderID
GROUP BY o.OrderID
ORDER BY NumItems DESC
結果顯示訂單 11077 有 25 種商品,遠超第二名的 6 種。
若要看每位客戶各產品採購總量,需四表聯結並依客戶與產品分組:
SELECT c.CompanyName, p.ProductName, Sum(od.Quantity) as TotalBought
FROM Customers c, Products p, Orders o, [Order Details] od
WHERE c.CustomerID = o.CustomerID
AND o.OrderID = od.OrderID
AND od.ProductID = p.ProductID
GROUP BY c.CompanyName, p.ProductName
ORDER BY CompanyName, TotalBought DESC
也可在同一查詢中使用多個彙總函式。例如取得每筆訂單的最大單品項採購量與總採購量:
SELECT o.OrderID,
Max(od.Quantity) as TopItem,
Sum(od.Quantity) as TotalBought
FROM Orders o, [Order Details] od, Products p
WHERE o.OrderID = od.OrderID
AND od.ProductID = p.ProductID
GROUP BY o.OrderID
ORDER BY TotalBought DESC
GROUP BY 是資料過濾與彙總分析的強大工具,善用它能在 SQL 資料表中高效計算所需統計資訊。