含有GROUPBY⼦句的查询中如何显⽰COUNT()为0的结果(SELECT语句完整的执⾏顺序)
含有GROUP BY⼦句的查询中如何显⽰COUNT()为0的结果
本⽂我们主要介绍了SQL Server数据库中在使⽤GROUP BY对查询出的结果进⾏分组时,COUNT()为0的结果⽆法显⽰的解决⽅法,希望能够对您有所帮助。
AD:
在SQL Server数据库查询中,为了对查询结果进⾏对⽐、分析,我们经常会⽤到GROUP BY⼦句以及COUNT()函数来对查询结果进⾏分类、统计等。但是我们在使⽤的过程中往往会存在⼀些问题,本⽂我们就介绍了⼀个问题,并给出了它的解决⽅案,接下来就让我们来⼀起了解⼀下这部分内容吧。
1.问题:
如下ExampleTable表,求各种类(CategoryID)满⾜Flag等于1的记录数。
ID Flag CategoryID
111
211
312
412
503
表1-ExampleTable
理想的结果应该如下:
CategoryID TotalNum
12
22
30
表2-理想输出结果
初看此问题,我们很容易写出如下语句:
SELECT CategoryID,COUNT(1) AS TotalNum FROM ExampleTable WHERE flag = 1 GROUP BY CategoryID
可运⾏之后得到的结果如下:
CategoryID TotalNum
12
22
表3-错误输出结果
没有CategoryID=3,TotalNum=0的记录。
2.原因分析:
造成以上结果的原因是因为在SELECT语句中WHERE⼦句先于GROUP BY执⾏,因此在执⾏GROUP BY⼦句时,表中的记录已经将Category = 3的记录过滤,分组处理中⾃然不会计算在内。
SQL SELECT语句完整的执⾏顺序:
1、FROM⼦句组装来⾃不同数据源的数据;
2、WHERE⼦句基于指定的条件对记录进⾏筛选;
3、GROUP BY⼦句将数据划分为多个分组;
4、使⽤聚集函数进⾏计算;group by的用法及原理详解
5、使⽤HAVING⼦句筛选分组;
6、计算所有表达式;
7、使⽤ORDER BY对结果进⾏排序。
3.解决⽅案:
构造含有所有CategoeyID的结果集与其上语句所得结果集进⾏连接,并利⽤NULL替换函数(如SQL SERVER中的ISNULL()、ORACLE中的NVL())将NULL替换为0。
⽰例语句如下:
1. SELECT DISTINCT MainTable.CategoryID,ISNULL(SubTable.SubNum, 0) AS TotalNum FROM ExampleTable AS MainTable LE
FT JOIN
2.
3. (SELECT CategoryID,COUNT(1) AS SubNum FROM ExampleTable WHERE flag = 1 GROUP BY CategoryID) AS SubTable
4.
5. ON MainTable.CategoryID = SubTable.CategoryID
执⾏后即可返回正确的结果:
CategoryID TotalNum
12
22
30
表4-正确输出结果
以上就是SQL Server数据库中含有GROUP BY⼦句的SELECT语句中显⽰COUNT()为0的结果的⽅法,本⽂就介绍到这⾥了,希望本次的介绍能够对您有所收获!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论