Sql 转换nvarchar值时转换失败';是';到数据类型int

Sql 转换nvarchar值时转换失败';是';到数据类型int,sql,sql-server,group-by,case,aggregate,Sql,Sql Server,Group By,Case,Aggregate,以下查询通过大约一百万行进行枚举,以计算MTBUR(计划外维修之间的平均时间): 我收到以下错误消息: Msg 245, Level 16, State 1, Line 4 Conversion failed when converting the nvarchar value 'YES' to data type int. 我推断错误消息中的YES是第一个'CASE'语句的布尔求值结果;如果我错了,请纠正我 以下是我的伪代码: The numerator is the sum of all

以下查询通过大约一百万行进行枚举,以计算MTBUR(计划外维修之间的平均时间):

我收到以下错误消息:

Msg 245, Level 16, State 1, Line 4
Conversion failed when converting the nvarchar value 'YES' to data type int.
我推断错误消息中的
YES
是第一个'CASE'语句的布尔求值结果;如果我错了,请纠正我

以下是我的伪代码:

The numerator is the sum of all hours between @BeginDate and @EndDate
The denominator is the COUNT of all confirmed status NOT LIKE %C and NOT LIKE %Y AND between @BeginDate and @EndDate.

我已经修改这个问题好几天了;是的,我是一个新手,但在学习。希望完成此操作并继续下一个sprint

您的案例从else返回int 0,但从when部分返回字符,但案例的返回类型必须一致

尝试将案例更改为返回1而不是确认

ie更改:

... THEN R.Confirm ELSE 0 END), SUM(H.Hours) ...
致:

并将包装函数从COUNT更改为SUM

/COUNT(CASE WHEN (R.ReceiveDate BETWEEN @BeginDate AND @EndDate) 
            AND (R.Confirm NOT LIKE 'C%' AND R.Confirm NOT LIKE 'Y%') 
            THEN R.Confirm ELSE 0 END)
错误实际上出现在您的第二个case语句中。 您的代码暗示R.Confirm是一个字符串,但当您的case语句为true时,您尝试除以它


所以这一行实际上需要修改:然后R.确认否则0结束

问题是,您做得不对。您的
COUNT CASE
语句应如下所示。另外,请注意,
R.Confirm NOT LIKE
应该是
条件,而不是

SUM(CASE WHEN R.ReceiveDate BETWEEN @BeginDate AND @EndDate 
AND (R.Confirm NOT LIKE 'C%' OR R.Confirm NOT LIKE 'Y%') 
THEN 1 ELSE 0 END)

你认为
YES
应该与
INT
中的什么类似?什么数据类型是
R.Confirm
?@JodyT R.Confirm是varcharIf我用
1
替换
R.Confirm
,那么DBMS如何知道计算
R.Confirm的数量不像C%或Y%
?@JeffOrris,你很困惑,在您的
count
中,您使用
CASE
检查条件,而不是计算所有行;只计算与案例条件匹配的行。我想计算符合条件的
R.Confirmed
列中的行。我读过关于sql的文章……这是漫长的一天……而且,我没有得到正确的答案results@JeffOrris,这是一个建议。检查编辑的答案(使用
SUM
而不是
COUNT
),然后再试一次。若你们仍然并没有得到正确的结果,那个么就编辑你们的帖子,并包括出了什么问题。希望这是有意义的。如果我用
1
替换
R.Confirm
,那么DBMS如何知道计算
R.Confirm的数量不像C%或Y%
?如果你将count改为SUM(根据我的回答),它会起作用,因为你将在1或0上求和,这和计算是一样的,当它是真的时,我现在明白了…我很困惑,我以为我应该只计算特定的列,但本质上我只想计算行(或和),我明白了…现在我得到了被零除的错误,这是我的COALESCE语句应该纠正的如果它对你有效,将有时返回零的和包装在一个案例中,以检查是否为零,并返回1,以防止被零除的错误
/COUNT(CASE WHEN (R.ReceiveDate BETWEEN @BeginDate AND @EndDate) 
            AND (R.Confirm NOT LIKE 'C%' AND R.Confirm NOT LIKE 'Y%') 
            THEN R.Confirm ELSE 0 END)
SUM(CASE WHEN R.ReceiveDate BETWEEN @BeginDate AND @EndDate 
AND (R.Confirm NOT LIKE 'C%' OR R.Confirm NOT LIKE 'Y%') 
THEN 1 ELSE 0 END)