【问题标题】:SPOTFIRE how do I shape by column in the map chart with a custom expressionSPOTFIRE 如何使用自定义表达式在地图图表中按列塑造形状
【发布时间】:2017-03-28 14:26:49
【问题描述】:

我有一个问题。我正在尝试在 Map Chart 中创建 Shapes by Column Values

我想通过自定义表达式创建这些形状。自定义表达式如下,我已将其简化,以便于阅读。

我想说的是:

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

【问题讨论】:

    标签: shape spotfire


    【解决方案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) = NULLNULL 不是&gt; 也不是&lt; 0,因此你的外部IF() 语句将返回 NULL 而不是 "UP" 或 "DOWN"

    长版

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

    如何解决这个问题

    IF() 语句中使用IS NULLIS 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()

    过度功能

    您可以通过一些计算列来更轻松地处理这个问题,以保持您的数据/表达式清晰易读

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

    【讨论】:

    • 嘿,谢谢!我将空值更改为 0 以进行测试,但它仍然无法正常工作。我会调查一下,看看我是否在某个地方犯了错误。 (附注你的附注,是的,我知道,我不想解释我必须在两个月前做一些滞后的事情,因为我觉得这会混淆我的问题)我不确定 calc 列是否有效,我们希望能够改变带有属性控件的时间范围。但也许他们会。无论如何,谢谢。
    • @brandog 您能否提供一些引发错误的示例数据?然后我们可以将其重新创建为 MCVE 并找出您的问题并解决问题。
    • 抱歉回复太晚了。我无法提供任何示例数据,但我意识到它无论如何都行不通。由于我在每月间隔之间切换,数据总是在变化,有时它们都是正数,下一次都是负数,然后都是负数。 Spotfire 不会让您设置形状,因此即使它有效,每次您选择新的月份间隔时,形状也会随机化。不过还是谢谢。
    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多