我有一个点火问题。我正在尝试在地图中中按列值创建形状。
我想通过自定义表达式创建这些形状。自定义表达式如下,我简化了它,因此更容易阅读。
我所说的只是:
if((当前月份油率 - 12MonthAgo Oilrate)/ 12MonthAgo Oilrate)> 0,“UP”,“Down”)
当我运行这个计算时虽然它只给了我一个值,(有正面和负面因此它应该给两个)。
我不确定我做错了什么?任何帮助表示赞赏。
<If(((((Sum(If(CurrentMonth),[OILRATECD],null))
-
Sum(If(12MonthsAgo),[OILRATECD],null)))))
/
Sum(If(12MonthsAgo),[OILRATECD],null)))>0,"UP","DOWN")>
原始方程:
<If(((((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)))))
/
Sum(If((Month([DATE])=Month(DateAdd("mm",-${MonthInterval}-2,DateTimeNow()))) and (Year([DATE])=Year(DateAdd("mm",-${MonthInterval}-2,DateTimeNow()))),[OILRATECD],null)))>0,"UP","DOWN")>
答案 0 :(得分:1)
首先,你有很多不必要的括号,但这不应该伤害任何东西。
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
而不是&#34; UP&#34;或&#34; DOWN&#34;
LONG VERSION
NULL
这是您想要的时,Spotfire忽略了SUM()
。例如,Sum(4,3,NULL) = 7
这就是我们想要的行为。的然而... 强> 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
如何解决这个问题
在IS NULL
语句中使用IS NOT NULL
和IF()
将其设置为默认值,或在当前表达式中使用0代替NULL
。
Sum(If((Month([DATE])=Month(DateAdd("mm",-2,DateTimeNow()))) and (Year([DATE])=Year(DateAdd("mm",-2,DateTimeNow()))),[OILRATECD],0))
BIG SIDE NOTE
你说你方程式的伪代码是:
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")
因此,您并未查看当前月份的油价,而是查看当前的油价。此外,您正在查看整个月的SUM()
... 。这可能是你想要的可能实际上正在寻找Max()
或Min()
功能
使用一些计算列可以更轻松地处理这个问题,以保持数据/表达清晰易读
DatePart("yy",[Date]) as [Year]
DatePart("mm",[Date]) as [Month]
Max([OILRATECD]) OVER (Intersect([Year],[Month])) as [YearMonthRate]
或使用SUM()
,如果这是您真正想要的。 Rank()