You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tableau中关联并对比三张多对多关系的表?

问题描述

正在搭建仪表盘,需对比三张表的匹配与不匹配行,具体信息如下:

表结构与数据

表1(所有行唯一,产品主数据)

IDPRODUCT NAMEREVENUE
1Name 1$100
2Name 2$200
3Name 3$300

表2(供应商1销售数据)

IDPRODUCT NAMEQUARTERCOUNTRYVENDORSALES
1Name 1Q1 2022United KingdomVENDOR 1$250
2Name 2Q1 2022United KingdomVENDOR 1$10
3Name 3Q1 2022JapanVENDOR 1$155
3Name 3Q2 2022United StatesVENDOR 1$40
2Name 2Q3 2022CanadaVENDOR 1$100

表3(供应商2销售数据)

IDPRODUCT NAMEQUARTERCOUNTRYVENDORSALES
1Name 1Q1 2022SwedenVENDOR 2$110
3Name 3Q3 2022BrazilVENDOR 2$50
4Name 4Q1 2022United StatesVENDOR 2$70
5Name 5Q2 2022CanadaVENDOR 2$20
5Name 5Q2 2022FranceVENDOR 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. 将表1设为维度表(主表),表2、表3设为事实表
  2. 建立表1与表2的关系:关联字段选ID(或同时关联ID+PRODUCT NAME,避免ID重复风险),关系类型设为多对多
  3. 建立表1与表3的关系:同样关联ID(或ID+PRODUCT NAME),关系类型设为多对多
  4. 无需建立表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. 用数字卡片展示各类计数与营收指标
  2. 用饼图/条形图展示供应商产品在表1中的占比
  3. 用表格/地图展示各季度、国家的唯一产品数
  4. 添加供应商、季度等过滤器,支持交互筛选

内容的提问来源于stack exchange,提问作者P K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:27:03