完全披露,我正在学习,我已经在互联网上搜索过,但我无法弄清楚我的问题。
我正在开设一个在线课程,并给出了以下示例:
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
返回以下结果:
我明白了(我想)所以我开始搞乱代码以进一步理解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
返回以下结果:
为了尝试打破这种情况,我创建了一个查询,只需在2005年1月查找订单并计算它们。
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE OrderDate >= '1/1/2005' AND OrderDate < '1/1/2005'
返回0.与SUM查询相同。我得到COUNT计数行和SUM汇总列中的数字,但我不理解我得到的结果。有人可以解释为什么计数查询在1月份返回2483而不是0?
答案 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;
甚至更短(默认ELSE
为NULL
,因此我们可以省略该部分)
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它添加所有条目