modélisation correcte du schéma en écanvas pour ssas tabular

J'utilise ssas tabular (powerpivot) et j'ai besoin de concevoir un model de données et d'écrire du DAX. J'ai 4 tables dans mon model de database relationnelle:

Commandes (order_id, order_name, order_type)
Spots (spot_id, order_id, spot_name, spot_time, spot_price)
SpotDiscount (spot_id, discount_id, discount_value)
Réductions (discount_id, discount_name)

Une command peut inclure plusieurs spots, mais un seul spot (spot_id 1) ne peut appartenir qu'à une seule command.
Une place peut inclure différentes réductions et chaque réduction a une valeur de réduction.
Ex:
Order_1 a un spot_1 ( spot_price 10), un spot_2 ( spot_price 20)
Spot_1 a discount_name_1 ( discount_value 10) et discount_name_2 ( discount_value 20)
Spot_2 a discount_name_1 ( discount_value 15) et discount_name_3 ( discount_value 30)

Je dois écrire deux mesures: prix (sum) et valeur-rabais (moyenne)

Comment puis-je concevoir correctement un schéma en écanvas avec une table de faits (ou peut-être deux tables de faits) pour que je puisse get dans mon cube powerpivot:

Si je choisis discount_name_1 je devrais order_1 avec spot_1 et spot_2 et le prix sur order_1 aura la valeur 50 et discount_value = 12,5
Si je choisis discount_name_3, je devrais order order_1 avec seulement spot_2 et le prix sur le niveau de la command = 20 et discount_value = 30

Fait (OrderKey, SpotKey, DiscountKey, Clé de date, TimeKey Spot_Price, Discount_Value, …)

DimOrder, DimSpot, DimDiscount, etc ….

TotalPrice:= SUMX( SUMMARIZE( Fact ,Fact[OrderKey] ,Fact[SpotKey] ,Fact[Spot_Price] ) ,Fact[Spot_Price] ) AverageDiscount:= AVERAGE(Fact[Discount_Value]) 

La table de faits est dénormalisée et vous vous retrouvez avec le schéma en écanvas le plus simple que vous puissiez avoir.

La première mesure mérite quelques explications. [Spot_Price] est dupliqué pour n'importe quel spot avec des remises multiples, et nous obtiendrions de mauvais résultats avec un simple SUM (). SUMMARIZE () fait un groupe sur toutes les colonnes qui lui sont passées, en suivant les relations (si nécessaire, nous regardons une seule table ici donc rien à suivre).

SUMX () parcourt cette table et accumule la valeur de l'expression dans son second argument. Le SUMMARIZE () a supprimé notre [Spot_Price] dupliqué afin que nous accumulions les uniques (par combinaison unique de [OrderKey] et [SpotKey]) dans une sum.

Vous dites

Une command peut inclure plusieurs spots, mais un seul spot (spot_id 1) ne peut appartenir qu'à une seule command.

Cela n'est pas pris en charge dans les définitions de table que vous donnez juste au-dessus de cette déclaration. Dans les définitions de table, une command n'a qu'un seul location mais (sauf si vous avez ajouté un index unique aux commands sur spot_id), chaque Spot peut avoir plusieurs commands. Chaque Spot peut également avoir plusieurs réductions.

Si vous voulez que la relation soit décrite dans vos mots, les définitions de table doivent être:

 Orders(order_id, order_name, order_type) OrderSpot(order_id, spot_id) -- with a Unique index on spot_id) Spots (spot_id, spot_name, spot_time, price) 

ou:

 Orders(order_id, order_name, order_type) Spots (spot_id, spot_name, spot_time, order_id, price) 

Vous pouvez créer le cube ssas avec Order comme table de faits, avec une dimension dans la table des points. Si vous ajoutez ensuite les tables SpotDiscount et Discount avec leurs relations (SpotDiscount to Spot, Discount to SpotDiscount), vous disposez de 1 dimension.

EDITER par commentaires

Eh bien, la table de faits aurait order_id, order_name, order_type

La Dimension serait composée des 3 autres tables et comporterait les colonnes qui vous intéressent: probablement spot_name, spot_time, spot_price, discount_name, discount_value.