SQL 聚合函數中的 HAVING 子句

SQL 聚合函數中的 HAVING 子句

在本教程中,我們將討論在 SQL 聚合函數中使用或執行 HAVING 子句的幾種方法在 SQL 聚合函數中使用此子句可以極大地幫助數據匯總。

HAVING子句幾乎類似於WHERE語句,也可以一起執行。

在學習本教程時,我們將通過提供示例來討論它們的相關性和差異。

目錄

SQL 中的 GROUP BY 和 WHERE 語句

對於我們的第一個示例,我們將討論如何使用下面的示例表來執行WHERE 子句GROUP BY 。 請注意,我們只能對現有列使用WHERE子句,而不能單獨在聚合函數中使用。

SQL 聚合函數中的 HAVING 子句

比方說,我們想要根據其值大於2 的SaleAmount列獲取產品的總銷售額。為了得到結果,我們的命令應該如下:

SQL 聚合函數中的 HAVING 子句

首先,我們選擇ProductName並彙總SaleAmount以獲得 TotalSales 。 

SQL 聚合函數中的 HAVING 子句

然後,我們在這裡使用了WHERE語句,因為我們試圖只獲取 SaleAmount大於2產品。命令'GROUP BY ProductName'表示它將ProductName列下的行分組為一個。

通過執行我們的命令集,我們將看到在ProductNameSaleAmount的所有數據中只顯示了 Bulb和Fan 。那是因為他們是唯一擁有大於 2 的SaleAmount 的人

SQL 聚合函數中的 HAVING 子句

在此示例中,WHERE語句用於使用現有列(即我們的SaleAmount)過濾結果。另外請注意,WHERE語句出現在GROUP BY之前,不能用於過濾聚合函數。另一方面,HAVING子句出現在GROUP BY之後,用於基於聚合函數的過濾。 

SQL 中的 GROUP BY 和 HAVING 子句

在此示例中,我們將演示WHERE語句和HAVING子句之間的區​​別。我們將使用與上一個示例中相同的目標,以便我們可以比較和評估結果。 

讓我們首先使用以下命令顯示產品及其總銷售額。如您所見,我們的第一個命令仍然與執行WHERE語句的第一個命令相同。

SQL 聚合函數中的 HAVING 子句

如果我們要執行前兩個命令,我們將得到以下結果:

SQL 聚合函數中的 HAVING 子句

現在,假設我們只想顯示總銷售額超過 5 的產品。我們不能使用WHERE 語句,因為它只能與現有列一起使用。因此,我們需要使用HAVING子句,因為我們將從聚合函數中進行過濾。 

SQL 聚合函數中的 HAVING 子句

請注意我們如何在GROUP BY之後使用HAVING子句,這與在GROUP BY之前使用的WHERE語句不同。這是因為 SQL 會在計算HAVING子句之前對記錄進行分組。 

然後讓我們執行這些命令以及HAVING SUM(SaleAmount)>5。在指定我們只想獲得總價大於5 的那些產品後,我們會注意到在當前的結果表中,我們將不再看到Pen。那是因為它的總數小於5。 

SQL 聚合函數中的 HAVING 子句

簡而言之,當我們想根據現有列從表中過濾數據時,我們使用WHERE 子句,而當我們想從聚合函數中過濾數據時,我們使用HAVING 子句。 

SQL Server Management Studio (SSMS) 中的 HAVING 和 WHERE 子句

現在,我們將繼續討論和演示如何在SQL Server Management Studio (SSMS) 中執行HAVING 子句。我們還將通過提供示例來解決HAVING 子句WHERE 子句之間的區​​別。

下面顯示的是我們的示例數據SalesOrderHeader。此數據包含100 行。對於我們的示例,我們希望通過CustomerID 獲取TotalSale,其中TotalSale大於10000。請注意,總銷售額基於TotalDue列值的總和。

SQL 聚合函數中的 HAVING 子句

首先,讓我根據上面的示例 演示當我們想要對聚合函數進行過濾時為什麼不能使用WHERE 子句。

我們將使用下圖中的示例命令集。如您所見,從技術上講,我們擁有與第一個示例中相同的命令集。

但是當我們點擊左上角的Execute時,會報錯,因為我們在聚合函數過濾時不能單獨使用WHERE子句。

SQL 聚合函數中的 HAVING 子句

要更正錯誤,我們需要使用HAVING子句而不是WHERE子句來過濾結果。我們的新命令集應該類似於下圖。

SQL 聚合函數中的 HAVING 子句

現在,我們可以看到我們的錯誤已得到糾正,每個CustomerID 的結果都包含TotalSale大於10000的結果。

同樣,WHERE 子句總是在GROUP BY 子句之前使用,而HAVING 子句總是在GROUP BY 子句之後使用。

在 SQL 中同時使用 HAVING 子句和 WHERE 子句  

對於這個例子,假設我們想同時使用WHEREHAVING 子句。讓我們嘗試通過CustomerID獲取TotalSale,其中TotalSale大於10000,但僅限於TerritoryID等於1的客戶。 

由於我們要過濾包含TerritoryID為 1 的客戶的結果,因此我們將使用WHERE 子句。所以我們的命令應該和我們之前的一樣。同樣,我們在 GROUP BY 子句之前添加了一個WHERE 子句

SQL 聚合函數中的 HAVING 子句

目前,我們看不出之前的結果和這個新結果有什麼不同。但是,如果您仔細觀察右下角,我們現在只有64 行,而之前的數據有505 行。那是因為結果也是根據它們的TerritoryID過濾的。

結論

總而言之,我們只能對現有列使用WHERE子句。如果我們需要使用聚合函數進行過濾,我們需要改用HAVING子句。

在 SQL 聚合函數中使用HAVING子句並練習HAVING子句和WHERE子句一起執行的方法可以為用戶處理大量數據或記錄時提供便利。 

我希望我已經為您提供了關於如何在 SQL 聚合函數中使用HAVING子句的足夠信息和理解。如果您想了解有關此主題和其他相關內容的更多信息,您當然可以查看下面的相關鏈接列表。

一切順利,

哈菲茲


什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

如何在 R 中保存和加載 RDS 文件

如何在 R 中保存和加載 RDS 文件

您將學習如何在 R 中保存和加載 .rds 文件中的對象。本博客還將介紹如何將對像從 R 導入 LuckyTemplates。

回顧前 N 個工作日——DAX 編碼語言解決方案

回顧前 N 個工作日——DAX 編碼語言解決方案

在此 DAX 編碼語言教程中,了解如何使用 GENERATE 函數以及如何動態更改度量標題。

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

本教程將介紹如何使用多線程動態可視化技術從報告中的動態數據可視化中創建見解。

LuckyTemplates 篩選上下文簡介

LuckyTemplates 篩選上下文簡介

在本文中,我將貫穿過濾器上下文。篩選上下文是任何 LuckyTemplates 用戶最初應該了解的主要主題之一。

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

我想展示 LuckyTemplates Apps 在線服務如何幫助管理從各種來源生成的不同報告和見解。

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

了解如何在 LuckyTemplates 中使用度量分支和組合 DAX 公式等技術計算利潤率變化。

DAX Studio 中數據緩存的物化想法

DAX Studio 中數據緩存的物化想法

本教程將討論數據緩存物化的想法,以及它們如何影響 DAX 在提供結果時的性能。

使用 LuckyTemplates 進行業務報告

使用 LuckyTemplates 進行業務報告

如果直到現在你還在使用 Excel,那麼現在是開始使用 LuckyTemplates 來滿足你的業務報告需求的最佳時機。

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的