SQL:使用通用维度连接两个事实表

时间:2018-04-23 18:27:29

标签: sql join dimensions fact-table

我对SQL和查询以及此论坛都很陌生。我得到了关于如何将维度连接到事实表的概念。但是,我在通过公共维度表连接多个(两个)事实表时遇到了一些困难。

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

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

请参阅下面附带的简化示例,其中说明了我要查找的结果集。感谢

Table 1 and 2 are fact tables and table 3 and 4 dimension tables. Table 5 the desired result set.

3 个答案:

答案 0 :(得分:0)

您可以使用公共密钥加入他们:

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

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

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

答案 1 :(得分:0)

您可以从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

您还可以将Budget和Actual表中的customers和item_ids列表合并,以获取客户和项目的唯一列表作为起点。这样可以避免丢弃在一个或另一个事实表上不存在的项目。

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 */

答案 2 :(得分:0)

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

相关问题