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

nameageflg
li101
zhang110
wang111

我们有时想要的结果是

countagename
110li
111zhang
111wang

执行这句sql
SELECT COUNT(NAME),AGE,NAME FROM TABLE WHERE flag = 1 GROUP BY NAME

countagename
110li
111wang

分析:sql的执行顺序
因为在SELECT语句中WHERE子句先于GROUP BY执行,因此在执行GROUP BY子句时,表中的记录已经将flg = 0的记录过滤,分组处理中自然不会计算在内。
SQL SELECT语句完整的执行顺序:

1、FROM子句组装来自不同数据源的数据;
2、WHERE子句基于指定的条件对记录进行筛选;
3、GROUP BY子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用HAVING子句筛选分组;
6、计算所有表达式;
7、使用ORDER BY对结果进行排序。

解决方案:

构造含有所有name 的结果集与其上语句所得结果集进行连接,并利用NULL替换函数(如SQL SERVER中的ISNULL()、ORACLE中的NVL())将NULL替换为0。
例如此例:
SELECT O.ORG_NAME FROM ORG_ORGANIZATION O LEFT JOIN (

SELECT COUNT(CALL_LOGS_ID) API_CALL_AMOUNT,
APPLY_ORG_ID,PROVIDE_ORG_ID SERVICE_ORG_ID,PROVIDE_ORG_NAME ORG_NAME
FROM DS_API_CALL_LOGS
GROUP BY ORG_NAME
) CNT ON O.ORG_NAME=CNT.ORG_NAME

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值