首先,你有很多不必要的括号,但这不应该有什么坏处。
If(
(
( --this open parentheses is unneeded
( --this open parentheses is unneeded
(
Sum(If((Month([DATE])=Month(DateAdd("mm",-2,DateTimeNow()))) and (Year([DATE])=Year(DateAdd("mm",-2,DateTimeNow()))),[OILRATECD],null))
-
Sum(If((Month([DATE])=Month(DateAdd("mm",-${MonthInterval}-2,DateTimeNow()))) and (Year([DATE])=Year(DateAdd("mm",-${MonthInterval}-2,DateTimeNow()))),[OILRATECD],null))
)
) --this closed parentheses is unneeded
) --this closed parentheses is unneeded
/
Sum(If((Month([DATE])=Month(DateAdd("mm",-${MonthInterval}-2,DateTimeNow()))) and (Year([DATE])=Year(DateAdd("mm",-${MonthInterval}-2,DateTimeNow()))),[OILRATECD],null))
)
>0,"UP","DOWN")
您没有得到UP 和DOWN 返回的原因是条件不满足。 我们需要一个具有预期输出的样本数据集来验证这一点。
但是,关于 NULL 在您的 SUM(IF(...,[OILRATECD],NULL)) 表达式中,您可能会得到意外结果的原因如下。
TL;DR
如果您在IF() 语句中的条件从未被评估为真
然后NULL返回到SUM(),然后SUM(NULL,NULL,NULL) = NULL
而NULL 不是> 也不是< 0,因此你的外部IF()
语句将返回 NULL 而不是 "UP" 或 "DOWN"
长版
- 在评估
SUM() 时,Spotfire 忽略了 NULL这是您想要的。例如,Sum(4,3,NULL) = 7,这就是我们想要的行为。 但是...
- Spotfire 不会忽略
NULL 的加法、减法、除法和其他比较运算符,例如 >。所以,4 - NULL = NULL 和 NULL / 18 = NULL 等等。这意味着如果您的两个 SUM() 方法中的任何一个返回 NULL 那么您的整个表达式将是 NULL 因为...
-
NULL 不是>,也不是<,当然也不是= 0。NULL 是没有值,因此不能与任何东西进行比较或等同。例如,If(NULL > 1,"YES","NO") 不返回 YES 或 NO……它返回 NULL,缺少值。此外,If(NULL=NULL,"YES","NO") 也将返回 NULL
如何解决这个问题
在IF() 语句中使用IS NULL 和IS NOT NULL 将其设置为默认值,或者在当前表达式中使用0 代替NULL。
Sum(If((Month([DATE])=Month(DateAdd("mm",-2,DateTimeNow()))) and (Year([DATE])=Year(DateAdd("mm",-2,DateTimeNow()))),[OILRATECD],0))
重要说明
你说你的方程的伪代码是:
If((Current months oil rate - 12MonthAgo Oilrate)/12MonthAgo Oilrate)>0,"UP","Down")
这似乎不是您正在评估的内容。相反,我读到:
x = (-var) + (-2) thus var < -2 (i.e. -3....-6...-55)
if((sum([2 months ago oil rate]) - sum([x months ago oil rate])) > 0, "UP","DOWN")
因此,您永远不会查看当前月份的油价,而是查看当前 - 2。此外,您正在查看整个月的 SUM()... 这可能是您想要的您可能实际上正在寻找Max() 或Min()
过度功能
您可以通过一些计算列来更轻松地处理这个问题,以保持您的数据/表达式清晰易读
DatePart("yy",[Date]) as [Year]
DatePart("mm",[Date]) as [Month]
-
Max([OILRATECD]) OVER (Intersect([Year],[Month])) as [YearMonthRate] 或使用 SUM() 如果那是你真正想要的。
- 查看与
Rank() 的区别