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)
返回以下结果:
我明白了(我想)所以我开始搞乱代码以进一步理解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)
返回这些结果:
为了试图打破这种情况,我创建了一个查询,只需查看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?
对于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)
甚至更短(默认ELSE是NULL这样我们可以省略那部分)
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)