Sql 用公共维度连接两个事实表

Sql 用公共维度连接两个事实表,sql,join,dimensions,fact-table,Sql,Join,Dimensions,Fact Table,我得到了如何将维度连接到事实表的概念。然而,我在通过公共维度表连接多(两)个事实表时遇到了一些困难 具体来说,我有一个包含实际销售数字的事实表,还有一个包含预算数字的事实表。每个事实表共享两个维度表(客户表和项目表) 我的问题是,如何通过二维表连接两个事实表 请参阅下面附带的简化示例,它说明了我正在寻找的结果集 您可以在公用键上加入它们: select . . . from actualsales a join budgetsales b on a.customer = b.

我得到了如何将维度连接到事实表的概念。然而,我在通过公共维度表连接多(两)个事实表时遇到了一些困难

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

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

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


您可以在公用键上加入它们:

select . . .
from actualsales a join
     budgetsales b
     on a.customer = b.customer and a.item = b.item;
如果希望保留一个表或另一个表中缺少的行,则可能需要某种外部联接


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

您可以从Customer(维度)表开始,并将事实数据表连接到它:

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
您还可以将预算表和实际表中的客户和项目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 */

事实对事实的连接是不可取的。 创建一个事实对象或编写两个独立的查询,最后创建一个逻辑集

请阅读并接受回答问题的可能重复内容为“通过通用维度表连接多(两)个事实表”。不是“事实到事实的连接”。另外,这个答案太简单了,无法理解——请解释一下。此外,事实维度模型有许多方法,请参考您的方法。