Data-Warehouse
如何在具有行項粒度的事實表上匯總表頭級別的值?
根據我的閱讀,基於訂單標題/行項目結構的事實表的推薦粒度是行項目級別。在此過程中,僅適用於訂單標題的任何附加值都會針對每個行項目重複:
下面(來自第二個連結)是這種設計的一個例子:
在此範例中,適用於整個訂單的運費金額針對每個訂單項重複。
但是,如果您要滾動特定客戶下的所有運費,您將獲得兩倍的實際價值。你如何避免這種價值翻倍?
- 運費是否被視為此表的非附加事實?
- 是否需要某種特殊處理?
- 有沒有理由不簡單地擁有兩個(幾乎相同的)事實表?一份用於訂單,一份用於訂單項目?
我會介紹一種神奇的運輸產品,並僅將運輸價值與此相對(也留下了擁有多種運輸產品的可能性 - 重型 / 隔夜 / 等)。不過,我可能仍會將 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