GROUP BY子句的查詢中顯示COUNT()為0的結果


含有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的結果的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM