跳到主要内容
The importance of Only()

在该页面上

The importance of Only()

如果组中只有一个可能值,Only() 会返回一个值。该值将为聚合的结果。如果未指定聚合函数,则 Qlik Sense 默认设置为 Only()

如果图表维度和参数之间存在一对一关系,则 Only() 函数返回唯一可能的值。如果存在数个值,则会返回 NULL。例如,如果有多个产品的单价为 12,则只搜索单价为 12 的产品将会返回 NULL

下图显示了一对一和一对多关系之间的区别:

一个表格显示 Manager NumberManager 之间的一对一关系

一个表格显示 Sales Rep NameManager 的一对多关系

Only() 函数是一种聚合函数。它使用许多记录作为输入,只返回一个值,类似于 Sum()Count()Qlik Sense 几乎会在其所有计算中使用聚合。图表、排序表达式、文本框、高级搜索和计算标签中的表达式都是聚合,如果不涉及聚合函数,则无法计算。

但是,如果用户输入的表达式缺少显式聚合函数会怎样?例如,如果排序表达式设置为 Date 会怎样?或者,如果有一个针对购买过啤酒和葡萄酒产品的客户并使用表达式 =[Product Type]='Beer and Wine' 的高级搜索,又会怎么样?

这就是 Only() 函数影响计算的地方。如果表达式中没有显式聚合函数,则 Qlik Sense 隐式使用 Only() 函数。在上述情况中,Only(Date) 用作排序表达式,而 Only([Product Type])='Beer and Wine' 用作搜索条件。

有时新表达式返回用户不期望的结果。当只有一个 DateProduct Type 的可能值时,上述两个示例都适用,但当有多个值时,这两个示例都不适用。

使用 Only() 的不同表达式

我们将用相似表达式创建四个 KPI。这样,我们可以比较在表达式中使用裸字段引用或在不同 Only() 位置使用裸字段引用对选择结果的影响。

在应用程序内的 Importance of Only() 工作表上,您将找到以 Invoice Date 作为维度的筛选器窗格。

执行以下操作:

  1. 创建 KPI
  2. 单击添加度量项。单击 3 符号。
    表达式编辑器打开。
  3. 输入以下内容: Month([Invoice Date])
  4. 使用以下度量另外创建三个 KPIsMonth(Only([Invoice Date]))Month(Max([Invoice Date]))Only(Month([Invoice Date]))
  5. 单击应用

四个 KPIs 以及筛选器窗格显示三个不同但是相似的表达式。

提示注释在每个 KPI 中,数字格式已设置为度量表达式

当有裸字段引用时,将在最低级别插入 Only() 函数。这意味着前两个 KPIMonth([Invoice Date])Month(Only([Invoice Date])) 将被解释为相同的,并始终给出相同的结果。

您可以看到四个 KPI 中有三个返回了 NULL。第三个 KPIMonth(Max([Invoice Date])) 已返回值,即使没有进行选择。

编写表达式时,应始终确定要使用哪个聚合,或者如果有多个值,则要使用哪个值。如果要使用 NULL 来表示多个值,可以将表达式保持原样。对于数字,您可能需要改为使用 Sum()Avg()Min()Max()。对于字符串您可能希望使用 Only()MinString()

执行以下操作:

  1. 停止编辑工作表。
  2. 在“筛选器”窗格中,选择一月中的日期。
  3. 通过单击 m 确认选择。

KPI 结果在进行单个选择时更改。

但进行单个选择时,所有 KPI 返回正确答案。即使表达式包含裸字段引用(如 Month([Invoice Date]) 中的表达式),我们进行了唯一选择这一事实也可让它返回正确的值。

执行以下操作:

  1. 在“筛选器”窗格中,选择一月中的其他日期。
  2. 通过单击 m 确认选择。

当两次选择的日期都在 1 月份时,KPI 结果会发生变化。

前两个 KPI 返回 NULLL,其他两个 KPI 返回正确的一月的值。具体来说,第四个 KPI 返回正确的答案,因为我们选择的两个日期都是一月份的日期。

执行以下操作:

  1. 在“筛选器”窗格中,选择一月之外月份中的其他日期。
  2. 通过单击 m 确认选择。

当用不同月份的日期进行多个选择时,KPI 结果会发生变化。

当用不同月份的日期进行多个选择时,只有第三个 KPI 返回值。根据表达式 Month(Max([Invoice Date])),它返回所做选择中最大月份的值。由于 Only() 是自动插入到具有裸字段引用的表达式中,因此不能总是假设最低级别将适合您的表达式这点。Only() 的放置很重要。

有关更多信息,请参阅 Only