我得到了关于如何将维度连接到事实表的概念。但是,我在通过公共维度表连接多个(两个)事实表时遇到了一些困难。
具体来说,我有一个包含实际销售数据的事实表和一个包含预算数据的事实表。每个事实表共享两个维度表(一个客户表和一个项目表)
我的问题是,如何通过两个维度表连接两个事实表?
请参阅下面随附的简化示例,该示例说明了我正在寻找的结果集。
我得到了关于如何将维度连接到事实表的概念。但是,我在通过公共维度表连接多个(两个)事实表时遇到了一些困难。
具体来说,我有一个包含实际销售数据的事实表和一个包含预算数据的事实表。每个事实表共享两个维度表(一个客户表和一个项目表)
我的问题是,如何通过两个维度表连接两个事实表?
请参阅下面随附的简化示例,该示例说明了我正在寻找的结果集。
您可以使用公共键加入它们:
select . . .
from actualsales a join
budgetsales b
on a.customer = b.customer and a.item = b.item;
如果您想在一个表或另一个表中保留缺少的行,您可能需要某种外部连接。
这是一个非常不切实际的例子。即使作为一个类的示例,列的命名也很糟糕。更重要的是,没有时间维度——几乎所有事实表都有。
您可以从客户(维度)表开始并将事实表加入其中:
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
您还可以将 Budget 和 Actual 表中的客户列表和 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 */
事实上加入是不可取的。创建一个事实对象或编写两个单独的查询,最后创建一个逻辑集