Aggregate CASE语句中COUNT和SUM之间的差异

Tal*_*209 1 sql t-sql sql-server

完全披露,我正在学习,我已经在互联网上搜索,我只是无法弄清楚我的问题.

我正在进行在线课程,并给出了以下示例:

select 
     DATENAME(MONTH, DATEADD(MONTH, MONTH(OrderDate), -1)) AS  'Month',
     SUM(CASE WHEN YEAR(OrderDate) = 2005 THEN 1 ELSE 0 END) AS Orders,
     SUM(CASE YEAR(OrderDate) WHEN 2005 THEN Totaldue ELSE 0 END) AS 'Total Value'
from
    sales.salesorderheader
group by Month(orderdate)
order by Month(orderdate) ASC
Run Code Online (Sandbox Code Playgroud)

返回以下结果:

结果1

我明白了(我想)所以我开始搞乱代码以进一步理解Case语句.查看代码我认为Orders字段基本上是在一个月内查找所有订单,为每个订单分配1,然后将它们全部添加.因为每个人都分配了1我认为我可以将SUM更改为COUNT,我会得到相同的结果.

但是,这段代码:

select 
     DATENAME(MONTH, DATEADD(MONTH, MONTH(OrderDate), -1)) AS  'Month',
     COUNT(CASE WHEN YEAR(OrderDate) = 2005 THEN 1 ELSE 0 END) AS Orders,
     SUM(CASE YEAR(OrderDate) WHEN 2005 THEN Totaldue ELSE 0 END) AS 'Total Value'
from
    sales.salesorderheader
group by Month(orderdate)
order by Month(orderdate) ASC
Run Code Online (Sandbox Code Playgroud)

返回这些结果:

结果2

为了试图打破这种情况,我创建了一个查询,只需查看2005年1月的订单并计算它们.

SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE OrderDate >= '1/1/2005' AND OrderDate < '1/1/2005'
Run Code Online (Sandbox Code Playgroud)

返回0.与SUM查询相同.我得到COUNT计数行和SUM总和列中的数字,但我只是不明白我得到的结果.有人可以解释为什么计数查询在1月份返回2483而不是0?

Luk*_*zda 7

对于COUNT1和0是相同的.你真正需要的是NULL:

COUNT(ALL表达式)计算组中每行的表达式,并返回非空值的数量.

select 
   DATENAME(MONTH, DATEADD(MONTH, MONTH(OrderDate), -1)) AS  'Month',
   COUNT(CASE WHEN YEAR(OrderDate) = 2005 THEN 1 ELSE NULL END) AS Orders,
   SUM(CASE YEAR(OrderDate) WHEN 2005 THEN Totaldue ELSE 0 END) AS 'Total Value'
from sales.salesorderheader
group by Month(orderdate)
order by Month(orderdate) ASC;
Run Code Online (Sandbox Code Playgroud)

甚至更短(默认ELSENULL这样我们可以省略那部分)

COUNT(CASE WHEN YEAR(OrderDate) = 2005 THEN 1 END) AS Orders,
Run Code Online (Sandbox Code Playgroud)

例:

              SUM         COUNT         COUNT
2005           1            1             1
2006           0            0            NULL
2007           0            0            NULL
2005           1            1             1
===============================================
               2            4             2
Run Code Online (Sandbox Code Playgroud)