首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server HAVING 子句進階:計算列、多層聚合與 UDF 分解技巧

     編輯:關於SqlServer

HAVING 用於分組後篩選,必須配合 GROUP BY 且通常涉及聚合函數。

基礎範例:訂單總額 > 25000 的客戶

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;

解法:UDF 分解

  1. 建立表值函數 SalesTotals_fnt() 回傳 SalesOrderID, TotalSale (單層 SUM)。
  2. 建立標量函數 AverageSale_fns() 呼叫上述函數算 AVG(TotalSale)。
  3. 主查詢 CROSS APPLY 或變數引用平均值,計算比率、標籤 (高於/低於平均)。

原則:每個函數只做一層聚合,組合使用,符合單一職責、易測試、可復用。

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