我有一个销售事实表,并且销售可以以不同的重量单位发生:ST,MT,lb,kg等。用户喜欢以不同的测量单位(UOM),取决于他们通常居住的地方。我希望他们能够选择一个UOM,并显示该UOM中的所有数量。用同样的方法进行多币种兑换。它与货币有点不同,因为在两张事实表之间没有日期表。多对多单位转换SSAS多维
总之,我将如何设计UOM维度和事实转换率表,它们与事实销售表之间的关系。最后,我将如何把这个在立方体。我可以用度量表达式与多对多关系来做到吗,还是需要进行某种计算?
我有一个销售事实表,并且销售可以以不同的重量单位发生:ST,MT,lb,kg等。用户喜欢以不同的测量单位(UOM),取决于他们通常居住的地方。我希望他们能够选择一个UOM,并显示该UOM中的所有数量。用同样的方法进行多币种兑换。它与货币有点不同,因为在两张事实表之间没有日期表。多对多单位转换SSAS多维
总之,我将如何设计UOM维度和事实转换率表,它们与事实销售表之间的关系。最后,我将如何把这个在立方体。我可以用度量表达式与多对多关系来做到吗,还是需要进行某种计算?
得到这个终于想通了。抱歉,我没有截图。我目前没有这个项目。如果需要,请告诉我,我可以稍后再添加它们。
您必须创建与两个UOM维度表,一个from和一个UOM维度表的多对多关系,这两个维度表与其中的uom转换表完全相同,每个方向的转换率都有一个条目。在UOM相同的情况下,在实际转换表中包括每种方式1的转换,就像ST到ST的速率是1.
关系外键是这样的。
创建此之后,然后建立在关系使用标签多对多,并然后是衡量表达式来乘以您的转化率。
类似于典型的多对多货币转换设置,如下面的youtube视频所示,但dim_from_uom会替换您的日期表。 https://www.youtube.com/watch?v=gMCIu5Nh93M
如果有帮助,以下是我的转换函数的精简版。这里只展示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
返回