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

时间:2017-10-23 16:20:37

标签: sql sql-server tsql

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

我正在开设一个在线课程,并给出了以下示例:

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

返回以下结果:

Results 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

返回以下结果:

Results 2

为了尝试打破这种情况,我创建了一个查询,只需在2005年1月查找订单并计算它们。

SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE OrderDate >= '1/1/2005' AND OrderDate < '1/1/2005'

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

3 个答案:

答案 0 :(得分:7)

对于COUNT 1和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;

甚至更短(默认ELSENULL,因此我们可以省略该部分)

COUNT(CASE WHEN YEAR(OrderDate) = 2005 THEN 1 END) AS Orders,

示例:

              SUM         COUNT         COUNT
2005           1            1             1
2006           0            0            NULL
2007           0            0            NULL
2005           1            1             1
===============================================
               2            4             2

答案 1 :(得分:0)

当您使用count(*)时,您将计算所有行。如果你想计算你有多少订单,你必须使用一列:例如:count(OrderDate)。试试吧

答案 2 :(得分:0)

数量示例: 假设您的列有3个值,列名是

2 ---------- 5 ---------- 4 ----- Null

现在如果你运行

count (order)

它将返回= 3列中没有空的条目

总和示例:

2 ---------- 5 ---------- 4

现在如果你运行

sum (order)

它将返回= 2 + 5 + 4 = 11它添加所有条目