The importance of Only()
如果组中只有一个可能值,Only() 会返回一个值。该值将为聚合的结果。如果未指定聚合函数,则 Qlik Sense 默认设置为 Only()。
如果图表维度和参数之间存在一对一关系,则 Only() 函数返回唯一可能的值。如果存在数个值,则会返回 NULL。例如,如果有多个产品的单价为 12,则只搜索单价为 12 的产品将会返回 NULL。
下图显示了一对一和一对多关系之间的区别:
Only() 函数是一种聚合函数。它使用许多记录作为输入,只返回一个值,类似于 Sum() 或 Count()。Qlik Sense 几乎会在其所有计算中使用聚合。图表、排序表达式、文本框、高级搜索和计算标签中的表达式都是聚合,如果不涉及聚合函数,则无法计算。
但是,如果用户输入的表达式缺少显式聚合函数会怎样?例如,如果排序表达式设置为 Date 会怎样?或者,如果有一个针对购买过啤酒和葡萄酒产品的客户并使用表达式 =[Product Type]='Beer and Wine' 的高级搜索,又会怎么样?
这就是 Only() 函数影响计算的地方。如果表达式中没有显式聚合函数,则 Qlik Sense 隐式使用 Only() 函数。在上述情况中,Only(Date)用作排序表达式,而 Only([Product Type])='Beer and Wine' 用作搜索条件。
有时新表达式返回用户不期望的结果。当只有一个 Date 或 Product Type 的可能值时,上述两个示例都适用,但当有多个值时,这两个示例都不适用。
使用 Only() 的不同表达式
我们将用相似表达式创建四个 KPI。这样,我们可以比较在表达式中使用裸字段引用或在我们的表达中的位置加入 Only(),这会对你的选择结果产生很大影响。
在应用程序内的 Importance of Only()工作表上,您将找到以 Invoice Date 作为维度的筛选器窗格。
执行以下操作:
- 创建 KPI。
- 单击添加度量项。单击 符号。
表达式编辑器打开。 - 输入以下内容: Month([Invoice Date])
- 使用以下度量另外创建三个 KPIs:Month(Only([Invoice Date]))、Month(Max([Invoice Date])) 和 Only(Month([Invoice Date]))。
- 单击应用。
当有裸字段引用时,将在最低级别插入 Only() 函数。这意味着前两个 KPI、Month([Invoice Date]) 和 Month(Only([Invoice Date])) 将被解释为相同的,并始终给出相同的结果。
您可以看到四个 KPI 中有三个返回了 NULL。第三个 KPI、Month(Max([Invoice Date])) 已返回值,即使没有进行选择。
编写表达式时,应始终确定要使用哪个聚合,或者如果有多个值,则要使用哪个值。如果要使用 NULL 来表示多个值,可以将表达式保持原样。对于数字,您可能需要改为使用 Sum()、Avg()、Min() 或 Max()。对于字符串您可能希望使用 Only() 或 MinString()。
执行以下操作:
- 停止编辑工作表。
- 在“筛选器”窗格中,选择一月中的日期。
- 通过单击 确认选择。
但进行单个选择时,所有 KPI 返回正确答案。即使表达式包含裸字段引用(如 Month([Invoice Date]) 中的表达式),我们进行了唯一选择这一事实也可让它返回正确的值。
执行以下操作:
- 在“筛选器”窗格中,选择一月中的其他日期。
- 通过单击 确认选择。
前两个 KPI 返回 NULLL,其他两个 KPI 返回正确的一月的值。具体来说,第四个 KPI 返回正确的答案,因为我们选择的两个日期都是一月份的日期。
执行以下操作:
- 在“筛选器”窗格中,选择一月之外月份中的其他日期。
- 通过单击 确认选择。
当用不同月份的日期进行多个选择时,只有第三个 KPI 返回值。根据表达式 Month(Max([Invoice Date])),它返回所做选择中最大月份的值。由于 Only() 是自动插入到具有裸字段引用的表达式中,因此不能总是假设最低级别将适合您的表达式这点。Only() 的放置很重要。
有关更多信息,请参阅 Only - 图表函数