1

以下查询在它之外工作得很好,它仍然返回空值NULL而不是0. 具体来说,这是对指定日期范围内某事发生的次数的总和。如果参数中不存在该值(即NULL,),那么为了便于阅读,我希望它返回一个 0(该表是多个临时表的连接,仅包含整数。)我已经研究并发现这种情况“如何从 SQL 函数获取单个值时将 NULL 更改为 0? ”并尝试了那里的所有建议,包括COALESCE.

(SELECT tn.teamtext, tn.teamid, ISNULL(sum(ISNULL(case when CONVERT(smalldatetime,ca.dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' then 1 else 0 end, 0)), 0) AS cnt3
  FROM teamnames AS tn 
    LEFT OUTER JOIN caseaudit AS ca
    ON tn.teamID = ca.referteamID2
  WHERE ca.referteamid1 <> ca.referteamid2 AND ca.isactive = 1 AND ca.groupid = 18 AND ca.accountid = 2 AND ca.referteamid1 = 31 AND ca.auditnote <> 'Suspend Case'
  GROUP BY tn.teamtext, tn.teamid) AS c

为了了解我正在查看的返回表,这里是:

4H BOSS                    55   59  3
4H BSG                     0    3   2
4H SALES AND MKTG          0    0   0
ACCOUNTS RECEIVABLE        0    0   0
ASSET MANAGEMENT           9    16  0
AUDIT                      0    0   NULL
BOSS                       4    5   0
CORPORATE BSG              0    7   5
CUSTOMER SUPPORT           87   133 NULL
NETWORK ENGINEERING        11   15  0
PRODUCTION ENGINEERING     116  142 5
PRODUCTION OPERATIONS      0    1   0
SECURITY                   2    6   3
SNFAL PRODUCT TEAM         0    14  11
VOICE SERVICES             18   21  0
XEROX                      4    8   0
4

3 回答 3

2

我同意(到目前为止)另外两个回应——这个查询中的 NULL 逻辑应该像你说的那样工作。但...

我在本地表上运行了类似于您的查询的内容,一切正常。然后我添加了最外面的括号:

(SELECT...
 ...) AS c

并得到一个错误,因为 SQL 不支持该格式。这与显示四列的示例相结合,其中查询中仅列出了三列,这让我强烈怀疑这是更大查询中的子查询......在这种情况下,null/not null 问题可能与完整查询的逻辑,而不仅仅是这个子查询。如果我的猜测是正确的,请发布完整的查询供我们考虑。

于 2012-06-06T18:19:40.087 回答
1

我假设由于CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10'引用了正确的表,有时它可以评估为 NULL 并且案例没有得到它。

你可以尝试明确地做when (dModLast is null) then 0

编辑:

case
   when dModLast is null then 0
   when CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' then 1 
   else 0 
end 
于 2012-06-06T15:56:25.203 回答
1

改成

ISNULL(SUM(CASE WHEN ISNULL(ca.dModLast,0)=0 THEN 0 ELSE CASE WHEN CONVERT(smalldatetime,ca.dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' THEN 1 ELSE 0 END END),0) as cnt3
于 2012-06-06T16:06:43.280 回答