name | age | flg |
---|---|---|
li | 10 | 1 |
zhang | 11 | 0 |
wang | 11 | 1 |
我们有时想要的结果是
count | age | name |
---|---|---|
1 | 10 | li |
1 | 11 | zhang |
1 | 11 | wang |
执行这句sql
SELECT COUNT(NAME),AGE,NAME FROM TABLE WHERE flag = 1 GROUP BY NAME
count | age | name |
---|---|---|
1 | 10 | li |
1 | 11 | wang |
分析: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