优阅达 | Tableau 微课堂(106):关系

published: 2023-05-08

关系

本期我们将定义关系,并根据模拟的业务场景来探讨其对应的数据模型图。然后,根据这些模型图来对数据源进行关联,并使用关联好的数据源来回答一些重要的业务问题。

在这个过程中,我们将学习到新界面的各个方面,以及关键功能的特性,包括查看数据窗格的布局,探索如何显示或隐藏空值,使用多个表中的字段创建计算,以及使用自动生成的计数字段等。

最后,我们将微调性能选项设置,例如基数和引用完整性,以便更好地了解关系。

关系的定义

关系是在数据源逻辑层中的逻辑表之间创建的灵活连接线,有人亲切地称关系为“面条”。用于描述两个表如何基于公共字段相互关联,但不将表合并在一起。

关系是合并数据的一种新方式,与使用联接相比具有轻松、快速并且更灵活的优势:

  • 支持在单个数据源中使用位于不同详细级别的多个表,从而回答各种各样的业务问题;

  • 为所有类型的用户提供直观的分析体验;

  • 数据源易于创建,并且经过优化以提高效率,从而加快分析和报表制作的速度。

在跳转到 Tableau Desktop 之前,让我们先来熟悉一下业务场景。

业务场景和数据模型

假设我们有一家便利店,想通过分析交易数据来回答业务问题。

在便利店的 Product 表中,有八个在售的产品,每个产品都有唯一的产品 ID、产品名称、单价和单位变动成本。在 Category 表中可以看到,每个产品有对应的归类,所以每个类别中又包含了许多产品。

表之间的线表示一对多的关系。这两个表基于一个公共字段(Category ID)进行关联。

每天都会产生许多笔交易,每笔交易都有唯一的 Transaction ID。有些客户在交易期间使用我们的储值卡系统,这为我们提供了部分客户名单。

结合交易表和客户表来看,Doug 是交易 1 和交易 3 的回头客,交易 4 有一个未知的客户。

Customer 表和 Transaction 表之间存在一对多关系。这两个表基于一个公共字段(Customer ID)进行关联。

交易表和产品表有什么关系?

单笔交易可以包含多个产品,单个产品又可以出现在多笔交易中,所以这是多对多关系。

由于两个表之间没有公共字段,所以良好的数据库设计将通过在两个表之间添加一个Transaction Details 表来解决关联问题:Transaction ID 与 Product ID 结合,每个 ID 对应为一行。


在交易1中,还记录了售出的数量,购买的产品是两本杂志和一瓶水。


交易表和产品表之间的多对多关系已被两个一对多关系替换。


了解完毕数据模型图后,接下来就让我们在 Tableau Desktop 中对不同的数据表进行关联。

使用关系连接不同的数据表

打开 Tableau Desktop 2020.2,在“连接”界面上,连接到Microsoft Excel文件,选择本次示例数据源 “Convenience Store”,并选择“打开”。

在数据源界面上,可以看到左侧窗格中有五个表。先来看看最详细的交易明细表,将 Transaction Details 表拖到空白画布上,下方的概览窗格将显示数据预览。

当一个接一个地引入其他表时,数据源将类似于旋转90度的数据模型图。

将产品表拖到交易明细表右侧的空白处,注意代表两张表之间关系的“面条”,将出现“编辑关系”窗口。Tableau Desktop 基于一个公共字段(Product ID)自动关联了这两个表。

也可以手动选择公共字段,下方还有可用的性能选项设置,这里保留使用默认设置。关闭“编辑关系”窗口。

从左侧窗格中,将交易表拖入画布中的交易明细表右侧空白处。确认两个表是以 Transaction ID 字段进行关联。随后关闭“编辑关系”窗口。

将类别表拖到画布中产品表右侧空白处,让我们看看,如果不小心把它连接到错误的表上会发生什么。注意警告,这两个表之间没有公共字段。


若要修复拖放错误,请关闭“编辑关系”窗口,然后使用类别表的下拉列表并选择“移动到”,然后选择“产品”表。

类别表将自动移动到产品表的右侧,并将基于公共字段(Category ID)进行关联。关闭“编辑关系”窗口。

最后,将客户表拖到画布中交易表右侧的空白处。这些表将基于公共字段(Customer ID)进行关联。关闭“编辑关系”窗口。


点击菜单栏的“文件”,选择“保存”。选择保存为 Tableau 打包工作薄类型,以便将数据嵌入到工作薄中。将文件命名为 “Convenience_Store”,单击保存。


业务问题分析

单击工作表1,转入工作区界面。从左侧数据窗格中可以看到,现在的字段是按表来排列的。在每个表中,会有一条浅灰水平线将维度与度量值分开。

每个表都包含一个自动生成的字段,该字段是表中行数的计数。


先对产品表中的单位变动成本和单价进行格式设置。分别右键单击 2 个胶囊,在下拉菜单中选择“默认属性”-“数字格式”-货币(标准)。然后单击“确定”,保存工作簿。

接下来,我们需要创建分析视图,以回答几个业务问题。

01、问题一:最畅销和最不畅销的产品是什么?(同时显示产品 ID)

从产品表中,将 “Product Name” 字段拖到行中。从交易明细表中,将 “Quantity Sold” 字段拖入列中,按售出数量进行降序排序。将视图显示从“标准”设置为“整个视图”。

可以看到,最畅销的产品是水,最不畅销(没有任何交易)的产品是铅笔和钢笔。


将结果限制在实际销售的产品上。单击显示了两个空值的指示器,然后点击筛选数据。此项仅筛选出非空值的数量。让我们撤消此筛选,因为未售出的项也很重要。


接下来,还需要在视图中显示产品 ID。

它是产品表和交易明细表之间的公共字段,因为我们从哪个表中拖入 “Product ID” 字段尤为重要。如果将其从交易明细表中拖入,就只看到已售出的六种产品。

所以这里,要将 “Product ID” 字段从产品表中拖出,替换行上的胶囊。这将显示产品的完整列表。

再次对条形图进行排序,然后将工作表重命名为 Best and Worst Selling Products,保存工作簿。然后新建一个工作表。

02、问题二:每件产品的单位边际贡献是多少?

提示:单位边际贡献(CM)=单价(Unit Price)-单位变动成本(Unit Cost)。

创建一个计算字段,命名为 Contribution Margin。从产品表中拖入 “Unit Price” 字段,键入减号,再拖入 “Unit Cost” 字段。单击“确定”。

请注意,“Contribution Margin” 计算字段出现在产品表中,这是因为它基于单个表的字段创建的。

将 “Contribution Margin” 字段的默认数字格式设置为货币(标准)。再通过创建一个文本表来验证我们的计算。

按住键盘上的 Ctrl 键,同时选择 Product Name 、Contribution Margin、Unit Cost 和 Unit Price 这 4 个字段,然后点击工具栏右侧的:智能显示,选择文本表,然后再次单击“智能显示”将其关闭。

从工具栏中,将视图显示从“标准”设置为“整个视图”。在“度量值”卡上,重新排列度量顺序:Unit Price,Unit Cost,Contribution Margin。


可以清楚地看到,Contribution Margin 计算正确。将工作表重命名为 Contribution Margin per Product。保存工作簿,新建一个工作表。

03、问题三:每个类别和产品的销售收入、利润和利润率是多少?

我们将创建三个计算字段。右击“数据”窗格空白处,选择创建计算字段,将其命名为 “Sales Revenue”。

从交易明细表中,拖入“Quantity Sold”字段,键入星号(这是乘法符号),然后从产品表中拖入“Unit Price”,单击“确定”。

新增的计算字段 “Sales Revenue” 显示在数据窗格的底部,这是因为它基于多个表中的字段创建的,因此不能放在上面的任何表中。将 “Sales Revenue” 字段的默认数字格式设置为货币(标准)。 创建第二个计算字段,将其命名为 “Profit”。从交易明细表中拖入 “Quantity Sold” 字段,键入星号,然后从产品表中拖入 “Contribution Margin” 字段,单击“确定”。

“Profit” 字段也显示在 “数据” 窗格的底部,因为它使用的也是多个表中的字段。将 “Profit” 字段的默认数字格式设置为货币(标准)。

创建第三个计算字段 “Profit Margin”。计算公式是利润总和除以销售收入总和。这是一个预聚合计算,因为在公式中使用了 SUM 聚合。
在这里,重要的是在除法之前求和,而不是先除后加,以避免利润率百分比总和超过 100%。单击“确定”。聚合计算始终显示在“数据”窗格的底部。

将 “Profit Margin” 字段的默认数字格式设置为一个小数点的百分比。同样使用文本表来验证计算结果的准确性。

按住键盘上的 Ctrl 键,同时选择 Category Name、Product Name、Profit 、Profit Margin 和 Sales Revenue 这 5 个字段,然后点击工具栏右侧的智能显示,选择文本表,然后再次单击“智能显示”将其关闭。

从工具栏中,将视图显示从“标准”设置为“整个视图”。在“度量值”卡上,重新排列度量顺序:Profit、Sales Revenue、Profit Margin。

请注意,利润除以销售收入后,将用于更正每个产品的利润率百分比。


要确认类别级别的百分比是否正确,请点击菜单栏中的“分析”- “合计”-“添加所有小计”。可以看到,小计值正确。我们还将显示列总和,总和值也是正确的。


将工作表重命名为 Profit,Sales Revenue and Profit Margin per Category and Product,保存工作簿,新建一个工作表。

04、问题四:谁是最常光顾的顾客?

从客户表中,将 “Customer Name” 字段拖入行中,从交易表中,将自动生成的 “Transaction (Count)” 字段拖入列中,按交易计数降序排序,显示整个视图。


我们发现 Doug 是最常光顾的顾客。此外,交易 4 中的未知客户也包含在我们的比较中。

将工作表重命名为 Count of Transactions per Customer。保存工作簿,打开新工作表。

05、问题五:谁是最赚钱的客户?

这个问题需要用到五个表之中四个表的数据。从客户表中,将 “Customer name” 字段拖到行上;从“数据”窗格的底部,将 “Profit” 字段拖到列上;按利润进行降序排序。

可以发现 Doug 是我们最赚钱的客户。将工作表重命名为 “Profit per Customer”。保存工作簿,打开新工作表。

06、问题六:每位顾客购买了哪些类别?数量是多少?

这个问题需要用到五张表的所有数据,如下图所示。

从客户表中,将 “Customer Name” 字段拖到行上;从类别表中,将 “Category Name” 字段拖入行上 “Customer Name” 胶囊的右侧;从交易明细表中,将 “Quantity Sold” 字段拖到列上。按销售数量进行降序排序。

视图结果正确地反映了所有交易的类别和数量。将工作表重命名为 Quantity Sold per Customer and Category。保存工作簿。

性能选项

性能选项是在定义表之间的关系时可以指定和配置的选项。默认设置的情况下,可确保可视化中没有数据丢失。如有需要,也可以调整性能选项的设置,达到提高性能的效果。

下面,我们根据数据模型图和业务规则来对其进行不同的定义设置:

考虑不同的业务规则

客户可以没有交易记录吗?交易记录中可以没有客户吗?两个客户可以完成单笔交易吗?类别中可以没有产品吗?产品可以没有归属的类别吗?产品可以归属多个类别吗?

由于 Tableau Desktop 无法取得这些问题的答案,因此它必须考虑到以上所有规则都是有效的。所以,想要最大限度地提高查询性能,就必须提前设定这些业务规则。

我们将在调整性能选项中的基数和引用完整性设置时,定义这些业务规则:

类别表与产品表关联规则:一对多关系

单个类别中可以包含多个产品,单个产品仅能归属于单个类别。


某些类别包含产品,这意味着可以在分配产品之前添加新类别。


所有产品都必须归属在类别表所列出的其中一个类别中。

客户表与交易表关联规则:一对多关系

单个客户可以完成多笔交易,单笔交易只能由一个客户完成。因此,两个客户不能同时完成同一笔交易。


所有客户至少完成了一笔交易。有些交易是由客户表中列出的客户完成的,其他交易则可能没有客户完成。

交易表和交易明细表关联规则:一对多关系

一笔交易可以关联多项交易明细,但一项交易明细仅能归属一个交易。

所有交易都要有交易明细,所有交易明细仅能归属于交易表中所列出的交易。

产品表和交易明细表关联规则:一对多关系

一个产品可以出现在多项交易明细中,但每项交易明细仅能包含一个产品。


有些产品出现在交易明细中,有些产品(如铅笔和钢笔)则没有。

所有交易明细中都包含产品表中列出的产品。

通过以上对基数和引用完整性的调整,工作簿的性能得到了改进,可视化的结果仍然相同
本节 Tableau 微课堂到此结束,感谢你的耐心阅读。