含有GROUPBY子句的查詢中如何顯示COUNT()爲0的結果

含有GROUPBY子句的查詢中如何顯示COUNT()爲0的結果


本文我們主要介紹了SQL Server數據庫中在使用GROUP BY對查詢出的結果進行分組時,COUNT()爲0的結果無法顯示的解決方法,希望能夠對您有所幫助。

AD:51CTO學院:IT精品課程在線看!

在SQLServer數據庫查詢中,爲了對查詢結果進行對比、分析,我們經常會用到GROUPBY子句以及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-理想輸出結果

初看此問題,我們很容易寫出如下語句:

SELECTCategoryID,COUNT(1) AS TotalNum FROM ExampleTable WHERE flag = 1 GROUP BYCategoryID


可運行之後得到的結果如下:

CategoryID   TotalNum  

1   2  

2   2  

表3-錯誤輸出結果

沒有CategoryID=3,TotalNum=0的記錄。

2.原因分析:

造成以上結果的原因是因爲在SELECT語句中WHERE子句先於GROUP BY執行,因此在執行GROUPBY子句時,表中的記錄已經將Category = 3的記錄過濾,分組處理中自然不會計算在內。

SQLSELECT語句完整的執行順序:

1、FROM子句組裝來自不同數據源的數據;

2、WHERE子句基於指定的條件對記錄進行篩選;

3、GROUPBY子句將數據劃分爲多個分組;

4、使用聚集函數進行計算;

5、使用HAVING子句篩選分組;

6、計算所有表達式;

7、使用ORDERBY對結果進行排序。

3.解決方案:

構造含有所有CategoeyID的結果集與其上語句所得結果集進行連接,並利用NULL替換函數(如SQLSERVER中的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-正確輸出結果

以上就是SQLServer數據庫中含有GROUP BY子句的SELECT語句中顯示COUNT()爲0的結果的方法,本文就介紹到這裏了,希望本次的介紹能夠對您有所收穫!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章