Tableau 的函数 - 如何找到与 IF EXISTS 等效的函数

Tableau's functions - how to find an equivalent to IF EXISTS

我正在创建一个带有 'buttons' 的 Tableau 仪表板,它根据特定条件以及 select 在过滤器中编辑的内容显示为红色或绿色。过滤器只是 select 不同地区不同办公室的一种方式,当 select 访问一个办公室时,按钮应该改变颜色,这取决于该办公室是否达到了不同指标的目标。

Tableau 上的导航按钮无法适应这一点,因此我做了一个解决方法。对于每个 'button',我都创建了一个工作表,其中仅包含标签标记上的度量名称文本和颜色标记上的计算字段。然后我将工作表添加到仪表板并添加了一个操作,以便在单击 'button' 时转到相应的指标仪表板。

我遇到的问题是这些指标之一的条件着色。该指标基于库存水平。对于每个办公室,有多个库存类型类别,每个类别都有相应的目标,每个类别中有多个 'bins'。如果一个类别的箱子中的任何库存总计超过该办公室该类别的目标,我希望按钮变为红色。

尝试按逻辑输入- 对于当前筛选的数据:IF EXISTS(FOR EACH OFFICE( FOR EACH CATEGORY: [SUM(BinValue)< CategoryTarget])) THEN 'Green' ELSE 'Red'

我尝试将该逻辑转换为计算字段中的 Tableau 函数,并具有以下内容: SUM(INT({INCLUDE [Category]:Min([CategoryTarget])} > {INCLUDE [Category]:SUM(BinValue)}))

当我将 Office Name 和 Category pill 添加到工作表以测试我的逻辑时,此着色是正确的,但是当我删除这些 pill 时,着色不正确。当我尝试对所有办公室和目标的目标级别内的类别数量求和时,似乎出了点问题。

我已经尝试了以下函数的多次迭代,现在已经绕圈子好几天了: 包括、排除、固定、如果、求和、整数

如果有人知道如何正确地做到这一点,或者甚至只是能够有条件地为仪表板上的按钮着色的不同方式,我将非常感激。

我的数据结构如下,以一些虚拟数据为例:

Region SubRegion Office Category Bin BinValue CategoryTarget
North NorthWest Manchester Toys B123 30 50
North NorthWest Manchester Toys B456 40 50

因此,对于库存水平指标,selecting 任何 ALL/North/NorthWest/Manchester 过滤器选项应标记为红色,因为办公室中一个类别中的垃圾箱总数高于目标数量该办公室的该类别。

我已经更新了我的计算字段,但是我仍然无法正确显示 true/false 的分组。 这就是现在的样子: MAX( {INCLUDE 类别,Office:Sum(BinValue)} > {INCLUDE 类别,Office:MIN(CategoryTarget)} ) True 显示为红色和 False Green(我们希望低于目标,因此显示为绿色)。

要使用逻辑条件,例如测试条件是否适用于一组数据行中的任何(或每条)记录,有助于理解 Tableau 将布尔值“True”视为大于布尔值值“假”。

一旦您对这个想法感到满意,就可以使用函数 MAX()(或 MIN())来测试条件是否适用于任何记录(或分别适用于每条记录)。所以 MAX(False, False, True, False) 为真。

因此,要判断是否有任何记录的实际值低于其目标值,请测试 MAX([Actual Value] < [Target Value])

然后,您可以将此想法与可视化项上的维度(或 LOD 计算,如有必要)相结合,在测试您的条件之前对数据记录进行适当分组。如果您重复使用相同的条件,这种类型的计算对于定义在多个地方使用的集合非常有用。

一个技术警告,如果您的条件测试曾经评估为 NULL,那么这些空值将被 MIN() 和 MAX() 忽略 - 就像其他聚合函数一样。因此,例如,您可以使用 MIN() 测试每条记录是否满足条件,如果所有非空值都为 True(因此 MIN() 报告 True),则可能会得到误导性结果。 MIN(TRUE, TRUE, NULL, TRUE) = TRUE。如果您的条件可以评估为 NULL,并且您不想忽略空值,而是将其视为与 False 相同,那么您可以使用 IFNULL() 函数为您的条件提供默认值。

例如,MIN(IFNULL([Actual Value] > [Target Value], FALSE)) returns 仅当每条记录的值都高于其目标时才为真,将任何具有缺失值或目标的记录视为未满足条件 - 即未超过目标。当然,选择条件是否具有默认值以及默认值应该是什么取决于问题。如果您的数据没有空值,则无需考虑这种复杂情况。

虽然你给的数据很少,但我觉得你需要的这个计算字段

IF { FIXED [Region], [Sub-Region], [Office], [Category] : SUM([Bin Value])}
> {FIXED [Region], [Sub-Region], [Office], [Category] : MIN([Category Target])} THEN 'RED' ELSE 'GREEN' END

这是基于这样的假设,即对于每组 region/sub-region/office/category 目标值在组内的每一行中都是相同的。 因此 MAX/AVG 等等。将全部代替计算中使用的 MIN

看到我在你的数据中添加了两行

和结果

在处理示例以展示问题时,我设法使其正常工作。

我最终使用了以下逻辑: max({EXCLUDE [Bin]:SUM([Bin Value])} > [类别目标])

这意味着即使过滤器中的大多数办公室都在其库存水平目标范围内,如果有一个库存水平超过目标,'button' 会显示为红色。

我发布了我一直使用的示例,以防将来对其他人有所帮助。 Link 到 Tableau Public 仪表板: https://public.tableau.com/views/ConditionalColouring/Dashboard1?:language=en-GB&:useGuest=true&:display_count=y&:origin=viz_share_link

非常感谢您的帮助!