Spotfire® 用户指南

基于条件的计算列

计算列时,您可能想要根据某些条件是否满足来获取不同的表达式结果。可以使用逻辑函数 If()Case() 在表达式中设置条件。

If()

使用函数 If() 时,可以指定为真或为假的条件,后接在条件为真时返回的内容以及在条件为假时返回的内容。

示例

表达式

If(([Amount]<10),"low","high")

意味着当列“Amount”中的行值小于 10 时,将在结果中返回值“low”;而当值为 10 或更大时,将返回值“high”。

如下图中所示:



换言之,函数 If() 会将行分为两个组;其中一个组包含指定的条件为真(在结果中返回“low”)的行,另一个组包含指定的条件为假(在结果中返回“high”)的行。

注:

如果要返回的值是聚合值,则会单独处理两个组。下表以添加的表达式为例说明了这点。

If(([Amount]<10),Avg([Amount]),Avg([Amount]))

该表达式包含平均值聚合。在此示例中,为两个组指定了相同的聚合,但可以使用不同的聚合。



对于小于 10 的行值,该组是“true”组,将返回平均值 6 ((5+7)/2);对于“false”组,平均值为 13 ((14+10+15)/3)。

函数 if() 还可以与 andor 结合使用。例如,表达式

If(([Customer age]<20) and ([Gender]="Female"),"girl","other")

将生成以下添加的计算列:



Case()

如果要编写条件结果不仅限于 true 和 false 的表达式,您可以使用函数 case()Case() 有两种不同的使用方式,下面举例介绍了这两种方式。

示例 1

假设以下书籍和视频的价格分别下降了 10% 和 50%,则价格列表需要更新。



由于下降幅度因产品类型而异,因此可以使用表达式 case() 来计算新价格:

case [Type]
when "Book" then [Price]*0.9
when "Video" then [Price]*0.5
else [Price]
end


在此示例中,case() 仅根据表达式中的每个 when 选项检查“Type”。

示例 2

在第二个示例中,使用 case() 来计算几名学生的测试结果。有以下三个计算级别:Failed(总分低于 100)、Passed 和 Excellent(总分为 160 或以上)。



在此示例中,Case() 为每个 when 选项单独计算条件:

case  
when ([Test A] + [Test B])<100 then "Failed" 
when ([Test A] + [Test B])>=160 then "Excellent"
else "Passed"
end

这样,可以实施比示例 1 更复杂的条件。

下面显示了生成的计算列:



注: 对于这两种 case() 形式,都可以在表达式中包含多个 when/then 条件。

条件的执行顺序

表达式 case() 的各个部分按照从上到下的顺序执行。请参见以下表达式和生成的列:

case
when [Number]<40 then "yes"
when [Number]<70 then "no"
else "x"
end


也就是说,小于 40 的数字设置为“yes”,并且不会更改。在该表达式的下一部分中,小于 70 的数字设置为“no”,并且只会影响剩余的行。