裸字段引用
如果字段未包含在聚合函数中,则将其视为裸字段。
裸字段引用是一个数组,可能包含多个值。如果是这样,Qlik Sense 将把其评估为 NULL,不知道您需要这些值中的哪些。
务必在表达式中使用聚合函数
如果发现表达式的计算不正确,则很有可能它没有聚合函数。
表达式中的字段引用是值的数组。例如:
必须将字段发票日期括在聚合函数中,使其转变为单个值。
如果不对表达式使用聚合函数,则默认情况下 Qlik Sense 将使用 Only() 函数。如果字段引用返回多个值,Qlik Sense 将把它解释为 NULL。
使用 If() 函数拆分发票日期
If() 函数通常用于条件聚合。它返回一个值,具体取决于函数内提供的条件的计算结果是 True 还是 False。
在应用程序内,在 Naked field references工作表上您将找到标题为 Using If() on Invoice dates 的表格。
执行以下操作:
- 选择标题为 Using If() on Invoice dates 的可用表格。
属性面板打开。 - 单击添加列并选择度量。
- 单击 符号。
表达式编辑器打开。 - 输入以下内容: If( [Invoice Date]>= Date(41323), 'After', 'Before' )
- 单击应用。
该表达式测试 Invoice Date 是否在参考日期 2013 年 2 月 18 日之前,如果是则返回 'Before'。如果日期晚于或等同于参考日期 2013 年 2 月 18 日,则会返回 'After'。参考日期表示为整数 41323。
有关更多信息,请参阅 if - 脚本和图表函数
避免裸字段引用
初看之下,该表达式没什么问题。
If([Invoice Date]>= Date(41323) 'After', 'Before')
它应当计算引用日期之后的发票日期,返回 'After' 或返回 'Before'。但是,Invoice Date 是裸字段引用,没有聚合函数,因此是具有数个值的数组,并且将计算为 NULL。在上一示例中,我们表格中每个 Date 值仅有一个 Invoice Date,因此表达式的计算没什么问题。
让我们看看类似的表达式如何在不同的维度值下计算,以及如何解决裸字段引用问题:
在 If() 函数中避免裸字段引用
我们将和之前一样使用相似的表达式:
If([Invoice Date]>= Date(41323), Sum(Sales))
这一次,函数对参考日期之后的销售额求和。
在应用程序内,在 Naked field references 工作表上您将找到标题为 Sum(Amount) 的表格。
执行以下操作:
- 选择可用的 Sum(Amount) 表格。
属性面板打开。 - 单击添加列并选择度量。
- 单击 符号。
表达式编辑器打开。 - 输入以下内容: If( [Invoice Date]>= 41323, Sum(Sales) )
- 单击应用。
对于每一年,都有一个在参考日期之后的发票日期数组。由于我们的表达式缺少聚合函数,其将计算为 NULL。正确的表达式应当在 If() 函数的第一参数中使用聚合函数,诸如 Min() 或 Max():
If(Max([Invoice Date])>= Date(41323), Sum(Sales))
执行以下操作:
- 单击添加列并选择度量。
- 单击 符号。
表达式编辑器打开。 - 输入以下内容: If( [Invoice Date]>= Date(41323), Sum(Sales) )
- 单击应用。
或者,可以将 If() 函数置于 Sum() 函数内:
Sum(If([Invoice Date]>= Date(41323), Sales) )
执行以下操作:
- 单击添加列并选择度量。
- 单击 符号。
表达式编辑器打开。 - 输入以下内容: Sum( If([Invoice Date]>= Date(41323), Sales ) )
- 单击应用。
在第二个到最后一个表达式中,If() 函数按每个维度值计算一次。在最后一个表达式中,它在原始数据中每行计算一次。函数运算方式的不同导致结果不同,但两者都返回一个答案。第一个表达式直接运算为 NULL。上图显示了两个表达式之间的差异,使用 2013 年 2 月 18 日作为参考日期。