【发布时间】:2018-10-03 21:19:15
【问题描述】:
我了解了如何将维度连接到事实表。但是,我在通过公共维度表连接多个(两个)事实表时遇到了一些困难。
具体来说,我有一个包含实际销售数据的事实表和一个包含预算数据的事实表。每个事实表共享两个维度表(一个客户表和一个项目表)
我的问题是,如何通过两个维度表连接两个事实表?
请参阅下面随附的简化示例,该示例说明了我正在寻找的结果集。
【问题讨论】:
标签: sql join dimensions fact-table
我了解了如何将维度连接到事实表。但是,我在通过公共维度表连接多个(两个)事实表时遇到了一些困难。
具体来说,我有一个包含实际销售数据的事实表和一个包含预算数据的事实表。每个事实表共享两个维度表(一个客户表和一个项目表)
我的问题是,如何通过两个维度表连接两个事实表?
请参阅下面随附的简化示例,该示例说明了我正在寻找的结果集。
【问题讨论】:
标签: sql join dimensions fact-table
你加入他们的公用键:
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
您还可以将“预算”和“实际”表中的客户列表和 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 */
【讨论】:
事实与事实的结合是不可取的。 创建一个事实对象或编写两个单独的查询,最后创建一个逻辑集
【讨论】: