Wie werden Werte auf Kopfebene in einer Faktentabelle mit Granularität für Werbebuchungen zusammengefasst?

7

Nach dem, was ich gelesen habe, liegt die empfohlene Granularität für eine Faktentabelle, die auf einer Auftragskopf- / Werbebuchungsstruktur basiert, auf Werbebuchungsebene. Dabei werden alle additiven Werte, die nur für den Auftragskopf gelten, für jede Position wiederholt:

Entwerfen von Dimensionsmodellen für Eltern-Kind-Anwendungen

Grundlagen der Dimensionsmodellierung

Unten (vom zweiten Link) ist ein Beispiel für ein solches Design:

Geben Sie hier die Bildbeschreibung ein

In diesem Beispiel wird der Versandbetrag, der für die gesamte Bestellung gilt, für jede Werbebuchung wiederholt.

Wenn Sie jedoch alle Versandbeträge unter einem bestimmten Kunden rollen würden, hätten Sie den doppelten tatsächlichen Wert. Wie vermeiden Sie diese Verdoppelung des Wertes?

  1. Wird die Versandmenge für diese Tabelle als nicht additive Tatsache betrachtet?
  2. Ist eine spezielle Behandlung erforderlich?
  3. Gibt es einen Grund, nicht einfach zwei (nahezu identische) Faktentabellen zu haben? Eine für Bestellungen und eine für Bestellpositionen?
8kb
quelle

Antworten:

4

Ich würde ein magisches Versandprodukt einführen und den Versandwert nur dagegen setzen (wobei die Möglichkeit offen bleibt, auch mehrere Versandprodukte zu haben - Schwer / Über Nacht / usw.). Ich würde den ShippingAmount wahrscheinlich immer noch von der ProductAmount-Spalte trennen, sodass Sie problemlos nur Produktverkäufe addieren können.

Jamie
quelle
Wäre das "magische" Versandprodukt ein Platzhalter, so dass eine Werbebuchung mit 0 Stück und 0 Bestellbetrag mit dem Versandbetrag existieren könnte? Bedeutet dies, dass Sie dann den Versandbetrag für die anderen Werbebuchungen auf Null setzen würden?
8kb
Ja - Nullen in Bestellmenge und -menge (damit sie wie zuvor hinzugefügt werden können) und Null in der Versandmenge für die anderen Werbebuchungen (es sei denn, sie haben spezielle Versandkosten für die Werbebuchung).
Jamie
+1 Das wird funktionieren. Sie können sogar die Spalte Versandbetrag entfernen.
Brian
@Jamie: Aber wenn ich eine Suchabfrage zur Produktdimension durchführen möchte (z. B. alle Produkte, die unter eine bestimmte Marke fallen), bedeutet dieses Design, dass ich alle meine "magischen" Produkte irgendwie herausfiltern muss. Ist das auch richtig? Es scheint, dass das Problem durch zwei Faktentabellen gelöst werden kann: eine für die Kopfebene und eine für die Werbebuchungsebene. Aber niemand scheint dies zu empfehlen.
8kb
Ich denke, wenn Sie eine Liste von Product.Brand erstellen, möchten Sie möglicherweise die Versandprodukte herausfiltern, aber das Hinzufügen eines Flags zur Produktdimension scheint keine große Herausforderung zu sein.
Jamie
2

Wie vermeiden Sie diese Verdoppelung des Wertes?

Sie können dies tun, indem Sie zuerst nach der Bestellnummer und dann nach dem Kundenschlüssel gruppieren. Hier ist ein Beispiel:

--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 
Leigh Riffel
quelle
Die Abfrage ist sinnvoll. Aber bedeutet dies, dass das Aufrollen nur innerhalb einer Ansicht erfolgen kann? Wenn Sie die Faktentabelle nehmen und daraus einen Würfel erstellen würden, könnte der Kunde diese Rollups anscheinend nicht in einer Pivot-Tabelle ausführen.
8kb
Ich denke, Sie haben gerade meinen aktuellen Wissensbereich verlassen. Vielleicht kann jemand anderes helfen. Ich hatte aber noch einen Gedanken. Könnten Sie den Versand einfach der ersten Position zuordnen und die anderen Positionen in der Bestellung als Null belassen?
Leigh Riffel
2

Sie können die Versandkosten gleichmäßig auf die Bestellpositionen verteilen. Auf diese Weise können Sie vom Kunden zusammenrollen.

Yasir
quelle
2

Wenn möglich, würde ich die Versandkosten den Werbebuchungen zuordnen. Auf diese Weise können Sie die tatsächlichen Kosten und den Gewinn für einzelne Produkte so genau wie möglich bewerten.

Wenn dies nicht möglich ist, stimme ich @ Jamies Idee zu, Shippingeine spezielle Art von "Produkt" herzustellen.

Dies wird von Kimball im Data Warehouse Toolkit (dritte Ausgabe), Seite 185, erörtert, obwohl er eine etwas andere Empfehlung abgibt:

Wenn die Versandkosten und andere Fakten auf Kopfebene nicht erfolgreich zugeordnet werden können, müssen sie in einer aggregierten Tabelle für die Gesamtbestellung dargestellt werden. Wenn möglich, bevorzugen wir eindeutig den Allokationsansatz, da die separate übergeordnete Faktentabelle einige inhärente Usability-Probleme aufweist. Ohne Zuordnung können Sie Header-Fakten nicht nach Produkt untersuchen, da das Produkt nicht in einer Header-Korn-Faktentabelle identifiziert wird.

Jon aller Berufe
quelle