我对SQL和查询以及此论坛都很陌生。我得到了关于如何将维度连接到事实表的概念。但是,我在通过公共维度表连接多个(两个)事实表时遇到了一些困难。
具体而言,我有一张包含实际销售数据的事实表,以及一张包含预算数字的事实表。每个事实表共享两个维度表(客户表和项目表)
我的问题是,如何通过两个维度表加入两个事实表?
请参阅下面附带的简化示例,其中说明了我要查找的结果集。感谢
答案 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)
事实与事实的结合是不可取的。 创建一个事实对象或编写两个单独的查询,最后创建一个逻辑集