2016-12-21 42 views
0

我有一个销售事实表,并且销售可以以不同的重量单位发生:ST,MT,lb,kg等。用户喜欢以不同的测量单位(UOM),取决于他们通常居住的地方。我希望他们能够选择一个UOM,并显示该UOM中的所有数量。用同样的方法进行多币种兑换。它与货币有点不同,因为在两张事实表之间没有日期表。多对多单位转换SSAS多维

总之,我将如何设计UOM维度和事实转换率表,它们与事实销售表之间的关系。最后,我将如何把这个在立方体。我可以用度量表达式与多对多关系来做到吗,还是需要进行某种计算?

回答

0

得到这个终于想通了。抱歉,我没有截图。我目前没有这个项目。如果需要,请告诉我,我可以稍后再添加它们。

您必须创建与两个UOM维度表,一个from和一个UOM维度表的多对多关系,这两个维度表与其中的uom转换表完全相同,每个方向的转换率都有一个条目。在UOM相同的情况下,在实际转换表中包括每种方式1的转换,就像ST到ST的速率是1.

关系外键是这样的。

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

创建此之后,然后建立在关系使用标签多对多,并然后是衡量表达式来乘以您的转化率。

类似于典型的多对多货币转换设置,如下面的youtube视频所示,但dim_from_uom会替换您的日期表。 https://www.youtube.com/watch?v=gMCIu5Nh93M

0

如果有帮助,以下是我的转换函数的精简版。这里只展示MASS,但技术很容易扩展。

简单的技巧是以基本单位存储所有转换因子,然后数学很简单。您可能会注意到我存储为varchar(),然后重新执行。这样的精度是动态

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') 

因此,例如,一个转换

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) 

返回

2204.62262184878 pounds 

现在

,如果你希望所有的转换价值

-- 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 

返回

enter image description here