HAVING 用於分組後篩選,必須配合 GROUP BY 且通常涉及聚合函數。
SELECT c.CustomerID, soh.SalesOrderID, SUM(sod.LineTotal) AS SubTotal
FROM Sales.Customer c
JOIN Sales.SalesOrderHeader soh ON soh.CustomerID = c.CustomerID
JOIN Sales.SalesOrderDetail sod ON sod.SalesOrderID = soh.SalesOrderID
GROUP BY c.CustomerID, soh.SalesOrderID
HAVING SUM(LineTotal) > 25000;
計算欄 LineTotal 可直接聚合。
-- 錯誤:Cannot perform an aggregate function on an expression containing an aggregate
SELECT AVG(SUM(LineTotal)) FROM ... GROUP BY SalesOrderID;
SalesTotals_fnt() 回傳 SalesOrderID, TotalSale (單層 SUM)。AverageSale_fns() 呼叫上述函數算 AVG(TotalSale)。CROSS APPLY 或變數引用平均值,計算比率、標籤 (高於/低於平均)。原則:每個函數只做一層聚合,組合使用,符合單一職責、易測試、可復用。