含有GROUP BY子句的查詢中如何顯示COUNT()為0的結(jié)果
在SQL Server數(shù)據(jù)庫查詢中,為了對(duì)查詢結(jié)果進(jìn)行對(duì)比、分析,我們經(jīng)常會(huì)用到GROUP BY子句以及COUNT()函數(shù)來對(duì)查詢結(jié)果進(jìn)行分類、統(tǒng)計(jì)等。但是我們在使用的過程中往往會(huì)存在一些問題,本文我們就介紹了一個(gè)問題,并給出了它的解決方案,接下來就讓我們來一起了解一下這部分內(nèi)容吧。
1.問題:
如下ExampleTable表,求各種類(CategoryID)滿足Flag等于1的記錄數(shù)。
ID | Flag | CategoryID |
1 | 1 | 1 |
2 | 1 | 1 |
3 | 1 | 2 |
4 | 1 | 2 |
5 | 0 | 3 |
表1-ExampleTable
理想的結(jié)果應(yīng)該如下:
CategoryID | TotalNum |
1 | 2 |
2 | 2 |
3 | 0 |
表2-理想輸出結(jié)果
初看此問題,我們很容易寫出如下語句:
SELECT CategoryID,COUNT(1) AS TotalNum FROM ExampleTable WHERE flag = 1 GROUP BY CategoryID
可運(yùn)行之后得到的結(jié)果如下:
CategoryID | TotalNum |
1 | 2 |
2 | 2 |
表3-錯(cuò)誤輸出結(jié)果
沒有CategoryID=3,TotalNum=0的記錄。
2.原因分析:
造成以上結(jié)果的原因是因?yàn)樵赟ELECT語句中WHERE子句先于GROUP BY執(zhí)行,因此在執(zhí)行GROUP BY子句時(shí),表中的記錄已經(jīng)將Category = 3的記錄過濾,分組處理中自然不會(huì)計(jì)算在內(nèi)。
SQL SELECT語句完整的執(zhí)行順序:
1、FROM子句組裝來自不同數(shù)據(jù)源的數(shù)據(jù);
2、WHERE子句基于指定的條件對(duì)記錄進(jìn)行篩選;
3、GROUP BY子句將數(shù)據(jù)劃分為多個(gè)分組;
4、使用聚集函數(shù)進(jìn)行計(jì)算;
5、使用HAVING子句篩選分組;
6、計(jì)算所有表達(dá)式;
7、使用ORDER BY對(duì)結(jié)果進(jìn)行排序。
3.解決方案:
構(gòu)造含有所有CategoeyID的結(jié)果集與其上語句所得結(jié)果集進(jìn)行連接,并利用NULL替換函數(shù)(如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
執(zhí)行后即可返回正確的結(jié)果:
CategoryID | TotalNum |
1 | 2 |
2 | 2 |
3 | 0 |
表4-正確輸出結(jié)果
以上就是SQL Server數(shù)據(jù)庫中含有GROUP BY子句的SELECT語句中顯示COUNT()為0的結(jié)果的方法,本文就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






