含有GROUP BY子句的查詢中如何顯示COUNT()為0的結果
在SQL Server數據庫查詢中,為了對查詢結果進行對比、分析,我們經常會用到GROUP BY子句以及COUNT()函數來對查詢結果進行分類、統計等。但是我們在使用的過程中往往會存在一些問題,本文我們就介紹了一個問題,並給出了它的解決方案,接下來就讓我們來一起了解一下這部分內容吧。
1.問題:
如下ExampleTable表,求各種類(CategoryID)滿足Flag等於1的記錄數。
ID | Flag | CategoryID |
1 | 1 | 1 |
2 | 1 | 1 |
3 | 1 | 2 |
4 | 1 | 2 |
5 | 0 | 3 |
表1-ExampleTable
理想的結果應該如下:
CategoryID | TotalNum |
1 | 2 |
2 | 2 |
3 | 0 |
表2-理想輸出結果
初看此問題,我們很容易寫出如下語句:
SELECT CategoryID,COUNT(1) AS TotalNum FROM ExampleTable WHERE flag = 1 GROUP BY CategoryID
可運行之后得到的結果如下:
CategoryID TotalNum
1 2
2 2
表3-錯誤輸出結果
沒有CategoryID=3,TotalNum=0的記錄。
2.原因分析:
造成以上結果的原因是因為在SELECT語句中WHERE子句先於GROUP BY執行,因此在執行GROUP BY子句時,表中的記錄已經將Category = 3的記錄過濾,分組處理中自然不會計算在內。
SQL SELECT語句完整的執行順序:
1、FROM子句組裝來自不同數據源的數據;
2、WHERE子句基於指定的條件對記錄進行篩選;
3、GROUP BY子句將數據划分為多個分組;
4、使用聚集函數進行計算;
5、使用HAVING子句篩選分組;
6、計算所有表達式;
7、使用ORDER BY對結果進行排序。
3.解決方案:
構造含有所有CategoeyID的結果集與其上語句所得結果集進行連接,並利用NULL替換函數(如SQL SERVER中的ISNULL()、ORACLE中的NVL())將NULL替換為0。
示例語句如下:
SELECT DISTINCT MainTable.CategoryID,ISNULL(SubTable.SubNum, 0) AS TotalNum FROM ExampleTable AS MainTable LEFT JOIN
(SELECT CategoryID,COUNT(1) AS SubNum FROM ExampleTable WHERE flag = 1 GROUP BY CategoryID) AS SubTable
ON MainTable.CategoryID = SubTable.CategoryID
執行后即可返回正確的結果:
CategoryID | TotalNum |
1 | 2 |
2 | 2 |
3 | 0 |
表4-正確輸出結果
以上就是SQL Server數據庫中含有GROUP BY子句的SELECT語句中顯示COUNT()為0的結果的方法