【问题标题】:SAS - PROC SQL - Case When arithmetic not making senseSAS - PROC SQL - 算术没有意义的情况
【发布时间】:2020-02-25 16:05:06
【问题描述】:

在 SAS Proc SQL 中,我使用此 Case 语句来尝试标记除每年 0.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


【解决方案1】:

问题可能是浮点运算。与浮点数的精确比较很麻烦。试试这样的:

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 是任意的。这只是一个很小的数字。

【讨论】:

  • 啊。好的。我应该考虑浮点数。感谢您的帮助!
【解决方案2】:

你可以使用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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多