Data-Warehouse

如何在具有行項粒度的事實表上匯總表頭級別的值?

  • April 10, 2015

根據我的閱讀,基於訂單標題/行項目結構的事實表的推薦粒度是行項目級別。在此過程中,僅適用於訂單標題的任何附加值都會針對每個行項目重複:

為父子應用程序設計維度模型

維度建模基礎

下面(來自第二個連結)是這種設計的一個例子:

在此處輸入圖像描述

在此範例中,適用於整個訂單的運費金額針對每個訂單項重複。

但是,如果您要滾動特定客戶下的所有運費,您將獲得兩倍的實際價值。你如何避免這種價值翻倍?

  1. 運費是否被視為此表的非附加事實?
  2. 是否需要某種特殊處理?
  3. 有沒有理由不簡單地擁有兩個(幾乎相同的)事實表?一份用於訂單,一份用於訂單項目?

我會介紹一種神奇的運輸產品,並僅將運輸價值與此相對(也留下了擁有多種運輸產品的可能性 - 重型 / 隔夜 / 等)。不過,我可能仍會將 ShippingAmount 與 ProductAmount 列分開,這樣您就可以輕鬆地僅將產品銷售額相加。

你如何避免這種價值翻倍?

您可以先按 OrderNumber 分組,然後按 CustomerKey 分組。這是一個例子:

--Setup.
DROP TABLE OrderLineItems;
CREATE TABLE OrderLineItems AS (
  SELECT 27 CustomerKey, 7867 OrderNumber, 49.98 OrderAmount
     , 3 ShippingAmount FROM dual);
INSERT INTO OrderLineItems VALUES (27,7867,12.99,3);
INSERT INTO OrderLineItems VALUES (39,7868,1321.99,132);
INSERT INTO OrderLineItems VALUES (19,7869,39.99,6);
INSERT INTO OrderLineItems VALUES (19,7870,1321.99,132);
COMMIT;

--Query.
SELECT CustomerKey, sum(OrderAmount), sum(ShippingAmount) FROM (
  SELECT CustomerKey, OrderNumber, sum(OrderAmount) OrderAmount
     , MIN(ShippingAmount) ShippingAmount 
  FROM OrderLineItems 
  GROUP BY CustomerKey, OrderNumber
)
GROUP BY CustomerKey;

CUSTOMERKEY SUM(ORDERAMOUNT) SUM(SHIPPINGAMOUNT)
----------- ---------------- -------------------
        27            62.97                   3 
        39          1321.99                 132 
        19          1361.98                 138 

引用自:https://dba.stackexchange.com/questions/23056