含有GROUP BY子句的查询中如何显示COUNT()为0的结果( SELECT语句完整的执行顺序)

含有GROUP BY子句的查询中如何显示COUNT()为0的结果


本文我们主要介绍了SQL Server数据库中在使用GROUP BY对查询出的结果进行分组时,COUNT()为0的结果无法显示的解决方法,希望能够对您有所帮助。

AD:2014WOT全球软件技术峰会北京站 课程视频发布

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。

示例语句如下:

 
 
  1. SELECT DISTINCT MainTable.CategoryID,ISNULL(SubTable.SubNum, 0) AS TotalNum FROM ExampleTable AS MainTable LEFT 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
1 2
2 2
3 0

表4-正确输出结果

以上就是SQL Server数据库中含有GROUP BY子句的SELECT语句中显示COUNT()为0的结果的方法,本文就介绍到这里了,希望本次的介绍能够对您有所收获!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 聚集函数可以直接使用在select子句、having子句group by子句,但不能直接使用在where子句。在where子句,需要使用聚集函数的结果作为条件进行筛选,通常需要使用子查询或者连接查询来实现。 <br>### 回答2: 聚集函数是SQL使用的一种非常重要的函数,它用于对数据进行聚合操作,并返回一个单一的结果。常用的聚集函数有SUM、AVG、COUNT、MAX和MIN等。 对于聚集函数的使用位,一般而言,聚集函数只能直接使用在SELECT子句和HAVING子句。在WHERE子句聚集函数是不能直接使用的,但可以通过子查询或者联结查询来达到聚集操作的目的。在GROUP BY子句,聚集函数则通常是必须的,因为它用于对每个分组内的数据进行聚集操作,而不是对所有数据进行聚集操作。 在SELECT子句使用聚集函数,通常是为了计算某个数据列的总和、平均值、最大值或者最小值等信息,以便更好地理解数据的特征。而在HAVING子句使用聚集函数,则是为了过滤掉不符合条件的记录,并仅保留符合条件的记录。 总的来说,聚集函数的主要作用是对数据进行分组、过滤和计算等操作,在SQL语句的位也会因为不同的作用而有所不同。但不管用在哪个位,聚集函数都是SQL语句不可或缺的一部分,其重要性不言而喻。 <br>### 回答3: 聚集函数是用来对数据进行统计计算的函数,包括SUM、AVG、MAX、MIN、COUNT等。这些函数可以直接应用到SELECT语句,用于对查询结果进行聚合操作,算出统计数据。 在SELECT子句,可以通过聚集函数来计算一个表某个字段的总和、平均数、最大值、最小值、行数等。例如:SELECT SUM(salary) FROM employee; 在HAVING子句,聚集函数用来过滤分组后的数据。HAVING子句可以根据聚集函数的计算结果来筛选分组后的数据。例如:SELECT department, COUNT(*) FROM employee GROUP BY department HAVING COUNT(*) > 5; 在WHERE子句,聚集函数也可以使用,但是有一些限制。如果在WHERE子句使用聚集函数,通常需要结合子查询或按照条件进行分组。例如:SELECT name, salary FROM employee WHERE salary > (SELECT AVG(salary) FROM employee); 在GROUP BY子句,聚集函数被用来对指定的分组进行聚合操作。GROUP BY语句将数据按照指定的列分组,然后对每个分组执行聚集函数。例如:SELECT department, COUNT(*) FROM employee GROUP BY department; 总的来说,聚集函数可以应用在SELECT、HAVING、WHERE、GROUP BY等子句。但是,在不同的子句应用聚集函数时,需要注意其功能和用法的不同,避免出现语义不合适或数据不准确的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值