知识库

合并多个日期字段


发布时间: 24 Apr 2017
上次修改日期: 09 Apr 2024

问题

如何将多个日期字段合并到单个轴或单个日期标题中。

例如,每个订单有“[Order Date]”(订单日期)和“[Ship Date]”(发货日期)。最终目标是显示一个包含每个月下达和发货的订单数的折线图或交叉表。如果将“[Order Date]”(订单日期)用作轴或标题,则每个月的已发货订单数将不正确,反之亦然。

环境

Tableau Desktop

答案

附带的示例工作簿使用示例数据集“Superstore”来演示所有选项
单击以展开解决方案
选项 1:转置日期字段
  1. 转置日期字段,以便只有一个包含日期数据的字段,以及另一个像“Event”(事件)这样的字段,该字段描述事件是“订单已下达”还是“订单已发货”。注意:对于某些数据源,可以直接在 Tableau Desktop 中完成转置。有关详细的指引,请参见对数据进行转置(从列到行)
  2. 右键单击并将“[Pivot Field Values]”(转置字段值)拖到“行”功能区
  3. 在“放置字段”对话框中,选择“MY(Pivot Field Values)”并单击“确定”
  4. 在“数据”窗格中右键单击“[Pivot Field Names]”(转置字段名称),并选择“别名...”
  5. 在“编辑别名”对话框中,为“Order Date”(订单日期)和“Ship Date”(发货日期)指定一个描述性更强的别名,并单击“确定”
  6. 将“[Pivot Field Names]”(转置字段名称)拖到“列”功能区
  7. 右键单击并将“[Order ID]”(订单 ID)拖到“标记”卡上的“文本”
  8. 在“放置字段”对话框中,选择“CNTD(Order ID)”并单击“确定”
单击以展开解决方案
选项 2:使用 LOD 计算
此选项要求每个日期字段对于视图中的每个日期数据桶至少具有一条记录。在此示例中,每一行是一个月份,因此“[Order Date]”(订单日期)和“[Ship Date]”(发货日期)对于每个月至少需要有一个订单。
  1. 选择一个日期字段来创建日期轴或标题。此示例使用“[Order Date]”(订单日期)
  2. 右键单击并将“[Order Date]”(订单日期)拖到“行”功能区
  3. 在“放置字段”对话框中,选择带蓝色 # 图标的“MY(Order Date)”,并单击“确定”
  4. 右键单击并将“[Order ID]”(订单 ID)拖到“标记”卡上的“文本”
  5. 在“放置字段”对话框中,选择“CNTD(Order ID)”
  6. 在视图中右键单击标题“Distinct count of Order ID”(订单 ID 的不重复计数),并选择“编辑别名...”
  7. 在“编辑别名”对话框中,键入一个新名称并单击“确定”
  8. 使用类似于如下的计算创建一个名称类似于“Orders Shipped”(已发货订单)的计算字段:

    MIN(
    IF DATETRUNC('month', [Order Date]) = DATETRUNC('month', [Ship Date])
    THEN { FIXED DATETRUNC('month', [Ship Date]) : COUNTD([Order ID]) }
    END
    )


    9.在“数据”窗格中双击“[Orders Shipped]”(已发货订单),将该字段添加到视图

     
单击以展开解决方案
选项 3:使用日期搭建
此选项要求一个日期字段始终在另一个日期字段之前,并且最适合于两个日期字段定义一个范围的情况。
  1. 创建一个包含所有可能日期的主列表的表,该列表将联接到原始数据连接。在此示例中,此表名为“Master Date List”(主日期列表)
  2. 导航到 Tableau Desktop 中的“数据源”选项卡
  3. 将“Sheet 1”(工作表 1)表添加到画布区域
  4. 在“联接”对话框中,执行以下操作:
    1. 选择“左”
    2. 在“数据源”下,选择“Order Date”(订单日期)
    3. 在“Sheet 1”(工作表 1)下,选择“Date”(日期)
    4. 单击等号,并选择“<=”
    5. 在“数据源”下,单击“添加新的联接子句”,并选择“Ship Date”(发货日期)
    6. 在“Sheet 1”(工作表 1)下,选择“Date”(日期)
    7. 单击等号,并选择“>=”
  5. 选择“分析”>“创建计算字段”
  6. 在打开的“计算字段”对话框中,执行以下操作,然后单击“确定”:
    1. 命名此计算字段。在此示例中,计算字段名为“Orders Placed”(已下达订单)
    2. 在公式字段中,创建一个类似于如下的计算:
      COUNTD(
      IF DATETRUNC('month', [Order Date]) = DATETRUNC('month', [Date])
      THEN [Order ID]
      END
      )
  7. 使用类似于如下的计算创建一个名称类似于“Orders Shipped”(已发货订单)的计算字段:
    COUNTD(
    IF DATETRUNC('month', [Ship Date]) = DATETRUNC('month', [Date])
    THEN [Order ID]
    END
    )
  8. 右键单击并将“[Date]”(日期)拖到“行”功能区
  9. 在“放置字段”对话框中,选择“MY(Date)”并单击“确定”
  10. 将“[Orders Placed]”(已下达订单)拖到“标记”卡上的“文本”
  11. 在“数据”窗格中双击“[Orders Shipped]”(已发货订单),将该字段添加到视图
单击以展开解决方案
选项 4:使用数据混合
此选项将不适用于日期范围。
  1. 创建一个包含所有可能日期的主列表的表,并创建一个到该列表的新连接。在此示例中,该连接名为“Sheet1 (master date list)”(工作表 1(主日期列表))
  2. 导航到“数据”>“Sample - Superstore”(示例 - Superstore)>“复制”。在此示例中,为清楚起见,我已将“Sample - Superstore”(示例 - Superstore)的两个副本命名为“Sample - Superstore (link on order date)”(示例 - Superstore(在订单日期上链接))和“Sample - Superstore (link on ship date)”(示例 - Superstore(在发货日期上链接))。
  3. 导航到“数据”>“编辑关系...”
  4. 在“关系”对话框中,执行以下操作:
    1. 对于“主数据源”,选择“Sheet1 (master date list)”(工作表 1(主日期列表))
    2. 对于“辅助数据源”,选择“Sample - Superstore (link on order date)”(示例 - Superstore(在订单日期上链接))
    3. 选择“自定义”单选按钮
    4. 单击“添加...”
  5. 在“添加/编辑字段映射”对话框中,执行以下操作:
    1. 单击“日期”旁边的箭头以展开日期选项
    2. 选择与视图中使用的最精细日期级别匹配的日期级别。在此示例中,视图使用“MY(Date)”。
    3. 在右侧窗格中,单击“Order Date”(订单日期)旁边的箭头
    4. 选择“Order Date”(订单日期)的匹配日期级别
    5. 单击“确定”
  6. 为作为辅助数据源的“Sample - Superstore (link on ship date)”(示例 - Superstore(在发货日期上链接))重复步骤 4-5,并在“MY(Date) = MY(Ship Date)”上添加关系
  7. 单击“确定”关闭“关系”对话框
  8. 在新工作表中,右键单击并将“[Date]”(日期)从“Sheet1 (master date list)”(工作表 1(主日期列表))数据连接拖到视图中
  9. 在“放置字段”对话框中,选择“MY(Date)”并单击“确定”
  10. 在视图中右键单击标题“Distinct count of Order ID”(订单 ID 的不重复计数),并选择“编辑别名...”
  11. 在“编辑别名”对话框中,键入一个新的描述性名称并单击“确定”
  12. 右键单击并将“[Order ID]”(订单 ID)从“Sample - Superstore (link on order date)”(示例 - Superstore(在订单日期上链接))数据源拖到“标记”标签的“文本”上
  13. 在“放置字段”对话框中,选择“CNTD(Order ID)”并单击“确定”
  14. 右键单击并将“[Order ID]”(订单 ID)从“Sample - Superstore (link on ship date)”(示例 - Superstore(在发货日期上链接))数据源拖到“标记”标签的“文本”上
  15. 在“放置字段”对话框中,选择“CNTD(Order ID)”并单击“确定”
  16. 将“CNTD(Order ID)”从“标记”卡上的“详细信息”拖到视图中的数字上面,并放置该字段
  17. 在“编辑别名”对话框中,键入一个新的描述性名称并单击“确定”

其他信息

有关选项 2(详细级别表达式)的注意事项:
  • 对于视图中使用的日期级别,每个日期字段至少必须有一条记录
  • FIXED 表达式将返回“[Ship Date]”(发货日期)中每个月已发货订单的不重复计数总数,而不管“[Ship Date]”(发货日期)的该月份出现在视图中的何处。例如,在二月发货的订单将同时放在一月和二月中。因此,FIXED 表达式本身在“ MY(Order Date) = January”和“MY(Order Date) = February”中都将返回 59 个订单。
  • 整个 IF 语句封装在 MIN() 中以避免 LOD 表达式将返回 IF 语句内部的重复值的问题。

有关选项 3(日期搭建)的注意事项:
  • 也可以列出位于较高日期级别的所有日期,例如每个月的第一天。然后,在步骤 4-2 和 4-5 中使用一个联接计算,该计算将原始表中的日期设置为正确的日期级别,例如 DATETRUNC('month', [Order Date])
  • 如果无法将包含所有日期的表添加到原始数据源,则创建一个联接到包含所有日期的外部表的跨数据库联接。这要求升级到 Tableau Desktop 10.5 或更高版本,以便利用跨数据库联接功能的联接子句中的不等式。
  • 这选项将复制数据,从而可能会对使用同一数据源的其他视图产生影响
  • 从 Tableau Prep 2021.3.1 开始,可以在 Tableau Prep 中创建日期搭建,而无需创建日期列表。有关指导,请参见填充顺序数据中的空白
有关选项 4(数据混合)的注意事项:
  • 数据混合有很多限制。如需获得潜在问题的帮助,请参见数据混合疑难解答
  • 链接到的日期必须在“关系”对话框中选择的最精细日期级别上完全匹配
  • 在不同数据源的字段之间创建关系时,每个字段一次只能与一个其他字段关联,这就是为何必须复制原始数据源的原因
  • 必须从在“MY(Date) = MY(Order Date)”上链接的原始数据源中拉取与“[Order Date]”(订单日期)关联的任何字段, 对于与“[Ship Date]”(发货日期)关联的任何字段则相反

显示一段时间内的活动记录
混合您的数据
在 Tableau 中创建详细级别表达式
包含详细级别表达式的 CASE 和 IF 语句返回意外结果
此文章是否已解决问题?