SPOTFIRE如何使用自定义表达式在地图图表中按列进行整形

时间:2017-03-28 14:26:49

标签: shape spotfire

我有一个点火问题。我正在尝试在地图中中按列值创建形状

我想通过自定义表达式创建这些形状。自定义表达式如下,我简化了它,因此更容易阅读。

我所说的只是:

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")>

1 个答案:

答案 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")

您未收到UPDOWN的原因是因为条件未得到满足。 我们需要一个带有预期输出的示例数据集来验证这个

但是,这就是为什么你的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

  1. 在评估NULL 这是您想要的时,Spotfire忽略了SUM()。例如,Sum(4,3,NULL) = 7这就是我们想要的行为。的然而...
  2. Spotfire不会忽略NULL加法,减法,除法和其他比较运算符,例如>。所以,4 - NULL = NULLNULL / 18 = NULL等等。这意味着,如果您的两个SUM()方法中的任何一个返回NULL,那么整个表达式将为NULL ,因为......
  3. NULL不是>也不是<,当然也不是= 0. NULL缺少值,因此无法与任何事物进行比较或等同。例如,If(NULL > 1,"YES","NO")不会返回YES或NO ...它返回NULL,缺少值。此外,If(NULL=NULL,"YES","NO")也会返回NULL
  4. 如何解决这个问题

    IS NULL语句中使用IS NOT NULLIF()将其设置为默认值,或在当前表达式中使用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()

    功能

    使用一些计算列可以更轻松地处理这个问题,以保持数据/表达清晰易读

    1. DatePart("yy",[Date]) as [Year]
    2. DatePart("mm",[Date]) as [Month]
    3. Max([OILRATECD]) OVER (Intersect([Year],[Month])) as [YearMonthRate]或使用SUM(),如果这是您真正想要的。
    4. 检查与Rank()
    5. 的区别