私が読んだことから、オーダーヘッダー/ラインアイテムの構造に基づくファクトテーブルの推奨粒度は、ラインアイテムレベルです。このプロセスでは、注文ヘッダーにのみ適用される追加の値が各ラインアイテムに対して繰り返されます。
以下(2番目のリンクから)は、そのような設計の例です。
この例では、注文全体に適用される送料が、各ラインアイテムで繰り返されます。
しかし、特定の顧客の下ですべての出荷金額をロールすると、実際の値が2倍になります。この値の2倍になることをどのように回避しますか?
私は魔法の配送製品を紹介し、これに対して配送金額を入れます(ヘビー/オーバーナイト/など、複数の配送製品を持つ可能性を残します)。ただし、おそらくShippingAmountをProductAmount列とは別に保持するので、製品の売上のみを簡単に合計できます。
可能であれば、送料を広告申込情報に割り当てます。これにより、個々の製品の実際のコストと利益をできるだけ正確に評価できます。
これが不可能な場合は、Shipping
を「製品」の特別なタイプにするという@Jamieのアイデアを2番目に引用します。
これについては、185ページのデータウェアハウスツールキット(第3版)でキンボールが説明していますが、彼は少し異なる推奨事項を示しています。
送料およびその他のヘッダーレベルのファクトを正常に割り当てることができない場合は、注文全体の集計表に表示する必要があります。別の高レベルのファクトテーブルにはいくつかの固有のユーザビリティの問題があるため、可能な場合は、割り当てアプローチを明らかに使用します。製品はヘッダーグレインファクトテーブルで識別されないため、割り当てがなければ、製品ごとにヘッダーファクトを探索することはできません。
この値の2倍になることをどのように回避しますか?
最初に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
送料を注文明細間で均等に分割できます。これにより、お客様がロールアップできるようになります。