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

GROUP BY子句的查询中显示COUNT()为0的结果的更多相关文章

  1. 含有GROUP BY子句的查询中如何显示COUNT()为0的成果(分享)

    在SQL Server数据库查询中,为了对查询成果进行对比.解析,我们经常会用到GROUP BY子句以及COUNT()函数来对查询成果进行分类.统计等.然则我们在应用的过程中往往会存在一些题目,本文我 ...

  2. T-SQL GROUP BY子句 分组查询

    SQL Server GROUP BY子句与SELECT语句协作使用,以将相同的数据分组. GROUP BY子句位于SELECT语句中的WHERE子句之后,位于ORDER BY子句之前. 语法 以下是 ...

  3. SQL中关于不能显示count为0的行的问题

    今天在写自己一个博客项目时遇到了一个数据库问题,因为对于数据库自己所知道的还是很浅显的,对一些查询语句不怎么熟悉. 我目前有一个文章表和评论表,评论表里面有个post_id对应文章表里面的id,想查询 ...

  4. FETCH - 用游标从查询中抓取行

    SYNOPSIS FETCH [ direction { FROM | IN } ] cursorname where direction can be empty or one of: NEXT P ...

  5. 用SQL查询方式显示GROUP BY中的TOP解决方法[转]

    用SQL查询方式显示GROUP BY中的TOP怎样用一个SQL语句来显示 分组后每个组的前几位 比如把一个学校所有学生的成绩按班级分组,再显示每个班级前五名的信息. 班级     学生   成绩 一班 ...

  6. 选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

    选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中 T-SQL核心语句形式: SELECT     --指定要选择的列或行及其限定  [INTO ]      --INTO子句 ...

  7. SQL中以count及sum为条件的查询

    在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7   例1:查询出现 ...

  8. SQL中以count或sum为条件的查询方式

    在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7   例1:查询出现 ...

  9. Mysql查询语句的 where子句、group by子句、having子句、order by子句、limit子句

    Mysql的各个查询语句 一.where子句   语法:select *|字段列表 from 表名 where 表达式.where子句后面往往配合MySQL运算符一起使用(做条件判断) 作用:通过限定 ...

随机推荐

  1. PageHelper 记录总条数不正确问题处理

    //PageHelper.startPage会返回一个page对象,这个对象在查询结果出来后会把页数,记录总数给page对象,用page.getPages()和getTotal()获取页数和记录总数. ...

  2. C#继承机制 访问与隐藏基类成员

    (1) 访问基类成员 通过base 关键字访问基类的成员:   调用基类上已被其他方法重写的方法.  指定创建派生类实例时应调用的基类构造函数.  基类访问只能在构造函数.实例方法或实例属性访问器中进 ...

  3. swl字符串

    创建字符串方法 去掉时间戳 #define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT ...

  4. 用css去除chrome、safari等webikt内核浏览器对控件默认样式

    有这么一个webkit的私有属性: -webkit-appearance:none; /*去除input默认样式*/ 添加该样式,并且值为'none'时即可取消浏览器对于控件的默认样式. 另外这个属性 ...

  5. fopen打开文件失败的问题

    fopen打开带中文路径或含中文名称的文件失败. 解决这个问题有两个方法:一是改用_wfopen,这个函数接受两个宽字符类型,函数原型如下: FILE* _wfopen(const wchar_t* ...

  6. 一次磁盘IO过高分析过程

    1.查看监控,发现整点时间有写IO过高情况

  7. node 中的redis使用

    1.创建sql.config.js 配置文件 : var redis_db = { ", "URL":"127.0.0.1", "OPTIO ...

  8. .pyc是什么鬼

    .pyc是个什么鬼? 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存 ...

  9. 利用Django提供的ModelForm增删改数据

    上一篇我们写了Django基于类如何增删改数据的方法,方法虽然简单,但新手可能对其原理不是很清楚,那么我们这次就用Django提供的ModelForm方法来实现增删改数据,这是一种基于现有模型的增删改 ...

  10. php扩展开发-函数

    我们首先找到快速上手文章里面关于函数定义的代码,以此说明然后开发PHP的函数 //php_myext.h PHP_FUNCTION(myext_hello);//函数申明,所有在myext.c文件定义 ...