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-正确输出结果

  • 相关阅读:
    微软认证考试考试 MCTS, MCITP, MCPD 享受9折优惠
    为程序中按钮添加Shield图标
    WinHEC 2008 China Windows 7 体验之蓝屏无罪
    我们像热爱生命一样热爱技术-洛杉矶Windows硬件工程大会
    WinHEC 之盖茨编年史期待 WinHEC 2008 China
    新年伊始 {阿猫阿狗的幸福生活系列} [一]
    通过数据库备份还原 TFS 到新服务器
    为托管应用程序添加DPI Aware支持
    轻松制作Windows Vista/Windows 7系统WIM镜像
    VSTS报表自定义之Bug重现频率报表
  • 原文地址:https://www.cnblogs.com/lmfeng/p/2133313.html
Copyright © 2011-2022 走看看