【问题标题】:Joining two fact tables with common dimensions连接两个具有共同维度的事实表
【发布时间】:2018-10-03 21:19:15
【问题描述】:

我了解了如何将维度连接到事实表。但是,我在通过公共维度表连接多个(两个)事实表时遇到了一些困难。

具体来说,我有一个包含实际销售数据的事实表和一个包含预算数据的事实表。每个事实表共享两个维度表(一个客户表和一个项目表)

我的问题是,如何通过两个维度表连接两个事实表?

请参阅下面随附的简化示例,该示例说明了我正在寻找的结果集。

【问题讨论】:

标签: sql join dimensions fact-table


【解决方案1】:

你加入他们的公用键:

select . . .
from actualsales a join
     budgetsales b
     on a.customer = b.customer and a.item = b.item;

如果您想在一个表或另一个表中保留缺少的行,您可能需要某种外连接。

这是一个非常不切实际的例子。即使作为一个类的示例,列的命名也很糟糕。更重要的是,没有时间维度——几乎所有事实表都有。

【讨论】:

    【解决方案2】:

    您可以从客户(维度)表开始,并将事实表加入其中:

    SELECT C.NAME Customer,
        iT.Name Item,
        SUM(a.Amount) Actual_Amount,
        SUM(b.Amount) Budget_Amount
    FROM Customer C
    INNER JOIN BUDGET B
    ON C.CUSTOMER_ID=B.CUSTOMER_ID
    INNER JOIN ITEM iT
    ON B.ITEM_ID=iT.ITEM_ID
    LEFT JOIN ACTUAL A /*THIS WILL RETURN BACK ROWS ON ACTUAL IF THEY EXIST*/
    ON A.CUSTOMER_ID=B.CUSTOMER_ID
    AND A.ITEM_ID=B.ITEM_ID
    GROUP BY C.NAME, iT.nAME
    

    您还可以将“预算”和“实际”表中的客户列表和 item_id 合并,以获取唯一的客户和项目列表作为起点。这样可以避免您删除一个或另一个事实表中不存在的项目。

    WITH CTE_CUST_ITEM_FACT AS (
    SELECT CUSTOMER_ID, ITEM_ID FROM ACTUAL
    UNION
    SELECT CUSTOMER_ID, ITEM_ID FROM BUDGET
    )
    SELECT * 
    FROM CTE_CUST_ITEM_FACT
    /* JOINING ACTUAL, BUDGET, ITEM, CUSTOMER BACK TO THIS LIKE ABOVE */
    

    【讨论】:

      【解决方案3】:

      事实与事实的结合是不可取的。 创建一个事实对象或编写两个单独的查询,最后创建一个逻辑集

      【讨论】:

      • 问题是“通过公共维度表连接多个(两个)事实表”。不是“事实加入”。另外,这个答案太简短而无法理解——请解释一下。此外,事实维度模型有很多方法/方法 - 请参考您的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多