连接两个具有共同维度的事实表

问题描述 投票:0回答:3

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

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

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

请看下面所附的简化示例,它说明了我正在寻找的结果集。

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

sql join dimensions fact-table
3个回答
0
投票

你在公共键上连接它们。

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

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

这是一个非常不现实的例子。 即使是作为一个类的例子,这些列的命名也是非常糟糕的。 更重要的是,没有时间维度--几乎所有事实表都有的东西。


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

你也可以将预算表和实际表中的客户列表和项目列表联合起来,得到唯一的客户和项目列表作为起点。这将使您免于放弃在一个或另一个事实表上不存在的项目。

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

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.