跳到主要内容 Skip to complementary content

裸字段引用

如果字段未包含在聚合函数中,则将其视为裸字段。

裸字段引用是一个数组,可能包含多个值。如果是这样,Qlik Sense 将把其评估为 NULL,不知道您需要这些值中的哪些。

务必在表达式中使用聚合函数

如果发现表达式的计算不正确,则很有可能它没有聚合函数。

表达式中的字段引用是值的数组。例如:

两个表格,一个示出 Max(Invoice Date) 为单个值,一个示出 Invoice Date 为值数组。

 Two tables, one showing that Max(Invoice Date) is a single value, and one showing that Invoice Date is an array of values.

必须将字段发票日期括在聚合函数中,使其转变为单个值。

如果不对表达式使用聚合函数,则默认情况下 Qlik Sense 将使用 Only() 函数。如果字段引用返回多个值,Qlik Sense 将把它解释为 NULL

使用 If() 函数拆分发票日期

If() 函数通常用于条件聚合。它返回一个值,具体取决于函数内提供的条件的计算结果是 True 还是 False。

在应用程序内,在 Naked field references 工作表上您将找到标题为 Using If() on Invoice dates 的表格。

执行以下操作:

  1. 选择标题为 Using If() on Invoice dates 的可用表格。
    属性面板打开。
  2. 单击添加列并选择度量
  3. 单击 Expression符号。
    表达式编辑器打开。
  4. 输入以下内容: If( [Invoice Date]>= Date(41323), 'After', 'Before' )
  5. 单击应用

在表格中按参考日期分割示出发票日期。

 Table showing invoice dates being split by a reference date.

该表达式测试 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) 的表格。

执行以下操作:

  1. 选择可用的 Sum(Amount) 表格。
    属性面板打开。
  2. 单击添加列并选择度量
  3. 单击 Expression符号。
    表达式编辑器打开。
  4. 输入以下内容: If( [Invoice Date]>= 41323, Sum(Sales) )
  5. 单击应用

以表格使用 If() 函数示出年份、每年销售额总和以及表达式结果。

 Table showing year, sum of sales for each year, and the results of the expression

提示注释在度量上保持标签完好,以示出每个表达式之间的差异。在具有货币值的列中,将数字格式设置为货币,并将格式样式设置为 $ #,##0;-$ #,##0

对于每一年,都有一个在参考日期之后的发票日期数组。由于我们的表达式缺少聚合函数,其将计算为 NULL。正确的表达式应当在 If() 函数的第一参数中使用聚合函数,诸如 Min()Max()

If(Max([Invoice Date])>= Date(41323), Sum(Sales))

执行以下操作:

  1. 单击添加列并选择度量
  2. 单击 Expression符号。
    表达式编辑器打开。
  3. 输入以下内容: If( [Invoice Date]>= Date(41323), Sum(Sales) )
  4. 单击应用

以表格使用 If() 函数示出年份、每年销售额总和以及不同表达式结果。

Table showing year, sum of sales for each year, and the results of the different expressions

或者,可以将 If() 函数置于 Sum() 函数内:

Sum(If([Invoice Date]>= Date(41323), Sales) )

执行以下操作:

  1. 单击添加列并选择度量
  2. 单击 Expression符号。
    表达式编辑器打开。
  3. 输入以下内容: Sum( If([Invoice Date]>= Date(41323), Sales ) )
  4. 单击应用

以表格使用 If() 函数示出年份、每年销售额总和以及不同表达式结果。

Table showing year, sum of sales for each year, and the results of the different expressions

在第二个到最后一个表达式中,If() 函数按每个维度值计算一次。在最后一个表达式中,它在原始数据中每行计算一次。函数运算方式的不同导致结果不同,但两者都返回一个答案。第一个表达式直接运算为 NULL。上图显示了两个表达式之间的差异,使用 2013 年 2 月 18 日作为参考日期。