Tableau 的函数 - 如何找到 IF EXISTS 的等价物

Posted

技术标签:

【中文标题】Tableau 的函数 - 如何找到 IF EXISTS 的等价物【英文标题】:Tableau's functions - how to find an equivalent to IF EXISTS 【发布时间】:2021-03-25 02:21:09 【问题描述】:

我正在创建一个带有“按钮”的 Tableau 仪表板,这些按钮根据特定条件和在过滤器中选择的内容显示为红色或绿色。过滤器只是在不同地区选择不同办公室的一种方式,在选择办公室时,按钮应根据该办公室是否达到不同指标的目标而改变颜色。

Tableau 上的导航按钮无法适应这种情况,因此我进行了解决。对于每个“按钮”,我创建了一个工作表,其中只有标签标记上的度量名称文本和颜色标记上的计算字段。然后,我将工作表添加到仪表板并添加了一个操作,以便在单击“按钮”时转到相应的指标仪表板。

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

尝试按逻辑输入- 对于当前过滤的数据: IF EXISTS(FOR EACH OFFICE( FOR EACH CATEGORY: [SUM(BinValue)

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

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

我已经尝试了以下功能的多次迭代,并且已经转了好几天: 包含、排除、固定、IF、SUM、INT

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

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

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

因此,对于 Stock Level 指标,选择所有/North/NorthWest/Manchester 过滤器选项中的任何一个都应标记为红色,因为办公室中一个类别中的垃圾箱总数高于该办公室该类别的目标数量.

我已经更新了我的计算字段,但是我仍然遇到分组正确显示为真/假的问题。 现在是这样的: MAX(INCLUDE Category, Office:Sum(BinValue) > INCLUDE Category, Office:MIN(CategoryTarget) ) True 显示为红色和 False Green(我们希望低于目标,因此是绿色)。

【问题讨论】:

欢迎来到 SO。你能分享一下你的数据/数据结构吗?否则请在超市数据上复制您的问题 @AnilGoyal - 我添加的数据结构够详细了吗? 所以这里的 binsum 是 70 而目标是 50,并且想将玩具涂成红色!我说的对吗? @AnilGoyal 是的,没错! 萨曼莎,您能否提供更多数据以供使用!这个问题虽然太罗嗦,但听起来并不难 【参考方案1】:

在处理示例以展示问题时,我设法让它发挥作用。

我最终使用了以下逻辑: max(EXCLUDE [Bin]:SUM([Bin Value]) > [Category Target])

这意味着即使过滤器中的大多数办事处都在其库存水平目标范围内,如果有一个办事处的库存水平超过目标,“按钮”将显示为红色。

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

非常感谢您的帮助!

【讨论】:

【参考方案2】:

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

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

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

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

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

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

【讨论】:

感谢您的回复!我已经编辑了我的计算字段以包含您的建议。这简化了代码,但我仍在努力获得正确的结果。我认为问题源于需要按类别对每个办公室的 Bin 值进行分组。 能否在某处发布示例,例如到 Tableau Public,然后在此处发布链接?【参考方案3】:

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

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用于计算。

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

结果

【讨论】:

以上是关于Tableau 的函数 - 如何找到 IF EXISTS 的等价物的主要内容,如果未能解决你的问题,请参考以下文章

tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?

tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?

Tableau Desktop 企业日常问题28Tableau 如何发布到public ?

如何安装Tableau并连接CDH的Hive/Impala

Tableau:特定维度/ COUNTD IF 语句的总数百分比

Tableau Desktop如何连接Teradata数据库?