如何在Tableau中关联并对比三张多对多关系的表?
问题描述
正在搭建仪表盘,需对比三张表的匹配与不匹配行,具体信息如下:
表结构与数据
表1(所有行唯一,产品主数据)
| ID | PRODUCT NAME | REVENUE |
|---|---|---|
| 1 | Name 1 | $100 |
| 2 | Name 2 | $200 |
| 3 | Name 3 | $300 |
表2(供应商1销售数据)
| ID | PRODUCT NAME | QUARTER | COUNTRY | VENDOR | SALES |
|---|---|---|---|---|---|
| 1 | Name 1 | Q1 2022 | United Kingdom | VENDOR 1 | $250 |
| 2 | Name 2 | Q1 2022 | United Kingdom | VENDOR 1 | $10 |
| 3 | Name 3 | Q1 2022 | Japan | VENDOR 1 | $155 |
| 3 | Name 3 | Q2 2022 | United States | VENDOR 1 | $40 |
| 2 | Name 2 | Q3 2022 | Canada | VENDOR 1 | $100 |
表3(供应商2销售数据)
| ID | PRODUCT NAME | QUARTER | COUNTRY | VENDOR | SALES |
|---|---|---|---|---|---|
| 1 | Name 1 | Q1 2022 | Sweden | VENDOR 2 | $110 |
| 3 | Name 3 | Q3 2022 | Brazil | VENDOR 2 | $50 |
| 4 | Name 4 | Q1 2022 | United States | VENDOR 2 | $70 |
| 5 | Name 5 | Q2 2022 | Canada | VENDOR 2 | $20 |
| 5 | Name 5 | Q2 2022 | France | VENDOR 2 | $125 |
需求清单
- 供应商1销售的产品中,存在于表1和不存在于表1的产品去重计数
- 供应商2销售的产品中,存在于表1和不存在于表1的产品去重计数
- 供应商1与供应商2共同销售的产品去重计数
- 供应商1销售但供应商2未销售的产品去重计数(反之亦然)
- 上述各类产品的总营收
- 各季度、各国家的唯一销售产品总数
已尝试的方法及问题
- 基于ID字段将表1与表2、表3全外连接,再将表2与表3全外连接,结果异常
- 修改表2与表3的全外连接条件,增加产品名称、季度、国家,销售数值仍异常
- 通过ID字段建立表1与表2、表3,以及表2与表3的关系,结果不正确
解决方案
第一步:构建正确的数据关系模型
放弃多表连接,改用Tableau的**关系(Relationship)**功能,避免笛卡尔积或重复计算:
- 将表1设为维度表(主表),表2、表3设为事实表
- 建立表1与表2的关系:关联字段选
ID(或同时关联ID+PRODUCT NAME,避免ID重复风险),关系类型设为多对多 - 建立表1与表3的关系:同样关联
ID(或ID+PRODUCT NAME),关系类型设为多对多 - 无需建立表2与表3的直接关系,通过表1间接关联即可;若需跨供应商对比,可通过
ID/PRODUCT NAME建立表2与表3的多对多关系
第二步:创建核心计算字段
1. 判断产品是否存在于表1
创建计算字段是否在表1中:
IF EXISTS(SELECT 1 FROM [表1] WHERE [表1].[ID] = [当前表].[ID]) THEN '是' ELSE '否' END
注:需根据表2/表3分别创建独立字段,如供应商1产品是否在表1、供应商2产品是否在表1
2. 供应商产品计数
- 供应商1在表1中的去重产品数:
COUNTD(IF [VENDOR] = 'VENDOR 1' AND EXISTS(SELECT 1 FROM [表1] WHERE [表1].[ID] = [表2].[ID]) THEN [ID] END)
- 供应商1不在表1中的去重产品数:
COUNTD(IF [VENDOR] = 'VENDOR 1' AND NOT EXISTS(SELECT 1 FROM [表1] WHERE [表1].[ID] = [表2].[ID]) THEN [ID] END)
- 供应商2在表1中的去重产品数:
COUNTD(IF [VENDOR] = 'VENDOR 2' AND EXISTS(SELECT 1 FROM [表1] WHERE [表1].[ID] = [表3].[ID]) THEN [ID] END)
- 供应商2不在表1中的去重产品数:
COUNTD(IF [VENDOR] = 'VENDOR 2' AND NOT EXISTS(SELECT 1 FROM [表1] WHERE [表1].[ID] = [表3].[ID]) THEN [ID] END)
3. 跨供应商产品对比计数
- 共同销售的产品去重数:
COUNTD(IF EXISTS(SELECT 1 FROM [表2] WHERE [表2].[ID] = [表3].[ID]) THEN [表2].[ID] END)
- 供应商1独有产品去重数:
COUNTD(IF [VENDOR] = 'VENDOR 1' AND NOT EXISTS(SELECT 1 FROM [表3] WHERE [表3].[ID] = [表2].[ID]) THEN [表2].[ID] END)
- 供应商2独有产品去重数:
COUNTD(IF [VENDOR] = 'VENDOR 2' AND NOT EXISTS(SELECT 1 FROM [表2] WHERE [表2].[ID] = [表3].[ID]) THEN [表3].[ID] END)
4. 各类产品总营收
先将表1的REVENUE字段转为数值型(去掉$符号),再创建计算字段:
- 供应商1在表1中产品的总营收:
SUM(IF [VENDOR] = 'VENDOR 1' AND EXISTS(SELECT 1 FROM [表1] WHERE [表1].[ID] = [表2].[ID]) THEN [表1].[REVENUE] END)
其他类别营收可替换对应条件,逻辑一致。
5. 各季度/国家的唯一销售产品数
- 按季度的唯一产品数:
COUNTD(IF [VENDOR] IN ('VENDOR 1','VENDOR 2') THEN [ID] END)
将QUARTER拖入行/列,该字段拖入标记卡即可;按国家统计同理,替换维度为COUNTRY。
第三步:仪表盘搭建要点
- 用数字卡片展示各类计数与营收指标
- 用饼图/条形图展示供应商产品在表1中的占比
- 用表格/地图展示各季度、国家的唯一产品数
- 添加供应商、季度等过滤器,支持交互筛选
内容的提问来源于stack exchange,提问作者P K
相关产品推荐
相关产品推荐

