zoukankan      html  css  js  c++  java
  • sum函数的小特性

    1.问题

    如下ExampleTable表,求各种类(CategoryID)满足Flag等于1的记录数,包括记录数为0的也要显示出来。

    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语句完整的执行顺序
       SQL SELECT语句完整的执行顺序:  

    1、FROM子句组装来自不同数据源的数据;  

    2、WHERE子句基于指定的条件对记录进行筛选;  

    3、GROUP BY子句将数据划分为多个分组;  

    4、使用聚集函数进行计算;  

    5、使用HAVING子句筛选分组;  

    6、计算所有表达式;  

    7、使用ORDER BY对结果进行排序。


    3.解决方案:

     1、 SELECT CategoryID,sum(case when flag = 1 then 1 else 0 end) AS TotalNum

          FROM ExampleTable 

          GROUP BY CategoryID
    //这个很好,很有扩展性,要是我们想要flag :1、2、3的统计结果,就可以这样写了:sum(case when flag = 1 or flag = 2 or flag = 3 then 1 else 0 end)

     2、SELECT CategoryID,SUM(flag) AS TotalNum  

        FROM tbl_category_test  

        WHERE ( flag = 1 OR flag = 0)  

        GROUP BY CategoryID

    这里面就是SUM()函数的特性的一个掌握,是很本质的东西,很关键,SUM(0)查出来地结果是0,SUM(1),查出来地结果是分组后的个数,根据这个特性,很好的完成了想要的结果。

    执行后即可返回正确的结果:

    CategoryID TotalNum
    1               2
    2               2
    3               0

              表4-正确输出结果

  • 相关阅读:
    VSCode:无法创建临时目录
    网页很卡的原因
    用css做三角形
    移动端加载页面出现抖动、未加载完成时布局杂乱问题解决
    vue中使用axios进行ajax请求数据(跨域配置)
    fetch和XMLHttpRequest
    1-5-JS基础-数组应用及实例应用
    图片左右切换
    轮播图片切换
    轮播图片切换(函数合并)
  • 原文地址:https://www.cnblogs.com/lmfeng/p/2133313.html
Copyright © 2011-2022 走看看