SAS-PROC SQL-算术没有意义的情况

问题描述 投票:0回答:2

在SAS Proc SQL中,我使用此Case语句尝试标记每年除.015以外的差异的策略:

CASE WHEN (MOD1 - MOD0) NOT = .015 THEN 2
     WHEN (MOD2 - MOD1) NOT = .015 THEN 3
     WHEN (MOD3 - MOD2) NOT = .015 THEN 4
     WHEN (MOD4 - MOD3) NOT = .015 THEN 5
     ELSE 0 END

奇怪的是,它在感觉应该正常时不起作用。 (例如mod1 = .955和mod0 = .94,但第一个语句认为它不是.015)起初,我认为这是一个数字问题,但从未奏效。

奇怪的是,它确实有效,我不知道为什么。

CASE WHEN (MOD1 - MOD0) NOT = (1- .985) THEN 2
     WHEN (MOD2 - MOD1) NOT = (1- .985) THEN 3
     WHEN (MOD3 - MOD2) NOT = (1- .985) THEN 4
     WHEN (MOD4 - MOD3) NOT = (1- .985) THEN 5
     ELSE 0 END

但是这不起作用

CASE WHEN (MOD1 - MOD0) NOT = (.2- .185) THEN 2
     WHEN (MOD2 - MOD1) NOT = (.2- .185) THEN 3
     WHEN (MOD3 - MOD2) NOT = (.2- .185) THEN 4
     WHEN (MOD4 - MOD3) NOT = (.2- .185) THEN 5
     ELSE 0 END

我有解决方法,可以解决所有这些问题(包括使用数据步骤),因此我并不是真正在寻找解决问题的方法,而是可以找到更多有关此情况的答案。我想了解为什么事情不起作用,而不是仅仅知道我能做和不能做的事情。

谢谢!

sql sas case arithmetic-expressions
2个回答
0
投票

问题可能是浮点运算。与浮点数进行精确比较比较麻烦。尝试这样的事情:

CASE WHEN ABS((MOD1 - MOD0) - 0.015) > 0.00001 THEN 2
     WHEN ABS((MOD2 - MOD1) - 0.015) > 0.00001 THEN 3
     WHEN ABS((MOD3 - MOD2) - 0.015) > 0.00001 THEN 4
     WHEN ABS((MOD4 - MOD3) - 0.015) > 0.00001 THEN 5
     ELSE 0
END

0.00001是任意的。这只是一小部分。


0
投票

您可以使用round功能:

(CASE WHEN round(MOD1 - MOD0,.0001) NOT = .015 THEN 2
     WHEN round(MOD2- MOD1,.0001) NOT = .015 THEN 3 
     WHEN round(MOD3 - MOD2,.0001) NOT = .015 THEN 4
     WHEN round(MOD4 - MOD3,.0001) NOT = .015 THEN 5
     ELSE 0 END 
© www.soinside.com 2019 - 2024. All rights reserved.