我有一个销售事实表,销售可以发生在不同的重量单位: ST,MT,lb,kg等。用户喜欢在不同的测量单位(UOM),取决于他们通常居住的地方。我希望他们能够选择一个UOM,它将显示UOM中的所有数量。同样,你也会对许多货币进行转换。但是,它与货币略有不同,因为在这两个事实表之间没有日期表。
总之,我将如何设计UOM维数、事实转换率表、它们与事实销售表之间的关系。最后,我如何把这个放在立方体里。我是否可以用一个度量表达式来处理多到多的关系,或者我需要进行某种计算?
发布于 2017-03-01 20:34:41
终于弄明白了。抱歉我没有截图。我目前还没有这个项目。如果需要的话,让我知道,我可以稍后再加。
您必须与两个UOM维度表、一个from和一个到UOM维度表之间的uom转换表创建多到多个关系,并为每个方向的转换速率输入一个条目。当UOM相同时,在事实转换表中包含一个速率为1的转换,就像ST到ST速率是1一样。
关系外键是这样的。
创建之后,然后在“关系使用”选项卡中设置“多到多”,然后使用度量值表达式将转换率乘以。
类似设置为典型的多到多货币换算,如下面的youtube视频所示,但dim_from_uom取代了您的日期表。https://www.youtube.com/watch?v=gMCIu5Nh93M
发布于 2016-12-21 21:59:50
如果有帮助,下面是我的转换函数的简化版本。这里只显示质量,但技术很容易扩展。
简单的技巧是将所有的转换因子存储在基本单位中,那么数学就很简单。您可能会注意到,我存储为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(ConvUnit=@From,cast(ConvFactor as float),null)) / Max(IIF(ConvUnit=@To,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 ConvUnit=@From) / cast(ConvFactor as float)
,ConvUnit
From @Conversion 返回

https://stackoverflow.com/questions/41271488
复制相似问题