2016-12-21 2 views
0

J'ai une table de faits de vente, et les ventes peuvent se produire dans différentes unités de poids: ST, MT, lb, kg, etc. Les utilisateurs aiment le voir dans différentes unités de mesure (UOM), selon l'endroit où ils vivent habituellement. Je voulais qu'ils soient en mesure de choisir un UOM et il montrerait toutes les quantités dans cette UOM. De la même manière que vous le feriez avec une conversion de plusieurs à plusieurs devises. C'est un peu différent des monnaies parce que vous n'avez pas de table de date entre les deux tables de faits.Plusieurs à plusieurs unités de conversion SSAS multi-dimensionnelle

En bref comment pourrais-je concevoir la dimension UOM, et les tables de taux de conversion de fait, la relation entre eux et la table des ventes de fait. Enfin, comment pourrais-je mettre cela dans le cube. Puis-je le faire avec une relation plusieurs à plusieurs avec une expression de mesure, ou y a-t-il une sorte de calcul que je dois faire?

Répondre

0

obtenu ceci a compris enfin. Désolé, je n'ai pas de captures d'écran. Je n'ai pas le projet disponible pour le moment. Si vous le souhaitez, faites le moi savoir, et je pourrai les ajouter plus tard.

Vous devez créer une relation many to many avec deux tables de dimension UOM, une table de dimensions from et a UOM identiques, avec la table de conversion uom entre, avec une entrée pour le taux de conversion pour chaque direction. Y compris une conversion avec un taux de 1 chaque façon dans la table de conversion de fait lorsque l'UOM est le même, comme ST à ST taux est 1.

Les clés étrangères de relation sont comme ceci.

  1. fact_sales < - 2. dim_from_UOM -> 3. fact_OUM_conversion < - 4. dim_to_uom

Après avoir créé cela, puis configurer le nombre à plusieurs dans l'onglet d'utilisation de la relation, et puis une expression de mesure pour multiplier votre taux de conversion.

Semblable à la conversion typique de plusieurs à plusieurs devises, comme indiqué dans la vidéo YouTube ci-dessous, mais le dim_from_uom remplace votre tableau de date. https://www.youtube.com/watch?v=gMCIu5Nh93M

0

Si cela aide, voici une version simplifiée de ma fonction de conversion. Seulement montrer MASS ici, mais la technique est facilement prolongée.

L'astuce consiste à stocker tous les facteurs de conversion dans les unités de base, puis le calcul est simple. Vous remarquerez peut-être que je stocke comme varchar(), puis effectuez une refonte. De cette façon, la précision est dynamique

Declare @Conversion table (MapType varchar(50),ConvUnit varchar(50),ConvFactor varchar(50)) 
Insert Into @Conversion values 
('Mass','tonnes (metric)','1000'), 
('Mass','tons (US)'  ,'907.18474'), 
('Mass','tons (UK)'  ,'1016.0469088'), 
('Mass','stones'   ,'6.35029318'), 
('Mass','slugs(g-pounds)','14.593903'), 
('Mass','Solar masses' ,'1.989e30'), 
('Mass','pounds (troy)' ,'0.3732417216'), 
('Mass','pounds'   ,'0.45359237'), 
('Mass','picograms'  ,'1e-15'), 
('Mass','ounces'   ,'0.028349523'), 
('Mass','ounces (troy)' ,'0.0311034768'), 
('Mass','nanograms'  ,'1e-12'), 
('Mass','milligrams'  ,'1e-6'), 
('Mass','micrograms'  ,'1e-9'), 
('Mass','megatonnes'  ,'1e9'), 
('Mass','kilotonnes'  ,'1e6'), 
('Mass','kilograms'  ,'1'),    --- << Base 
('Mass','hundredweights' ,'50.80234544'), 
('Mass','hectograms'  ,'0.1'), 
('Mass','grams'   ,'1e-3'), 
('Mass','grains'   ,'0.00006479891'), 
('Mass','femtograms'  ,'1e-18'), 
('Mass','Earth masses' ,'5.980e24'), 
('Mass','decagrams'  ,'0.01'), 
('Mass','cental'   ,'45.359237'), 
('Mass','carats (metric)','0.0002') 

Ainsi, par exemple, une conversion

Declare @Value float  = 1 
Declare @From varchar(50)= 'tonnes (metric)' 
Declare @To varchar(50)= 'pounds' 

-- For just the single conversion 
Select @Value * Max(IIF([email protected],cast(ConvFactor as float),null))/Max(IIF([email protected],cast(ConvFactor as float),null)) 
     ,@To 
From @Conversion 
Where ConvUnit in(@From,@To) 

Retours

2204.62262184878 pounds 

Maintenant, si vous voulez que toutes les conversions pour une valeur

-- To Convert ALL 
Select Concat(@Value,' ',@From) 
     ,@Value * (Select cast(ConvFactor as float) from @Conversion where [email protected])/cast(ConvFactor as float) 
     ,ConvUnit 
From @Conversion 

Retours

enter image description here