多对多单位转换 SSAS 多维

Many to Many Unit Conversion SSAS Multi-Dimensional

我有一个销售事实 table,销售可以以不同的重量单位进行:ST、MT、lb、kg 等。用户喜欢以不同的计量单位 (UOM) 来查看它,取决于他们通常住在哪里。我希望他们能够选择一个 UOM,它会显示该 UOM 中的所有数量。与多对多货币转换的方式相同。它与货币略有不同,因为在两个事实 table 之间没有日期 table。

简而言之,我将如何设计 UOM 维度和事实转化率 tables,它们与事实销售额 table 之间的关系。最后,我将如何将其放入立方体中。我可以使用带有度量表达式的多对多关系来完成它,还是需要进行某种计算?

如果有帮助,以下是我的转换函数的精简版。此处仅展示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')

So for example, One 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(ConvUnit=@From,cast(ConvFactor as float),null))  / Max(IIF(ConvUnit=@To,cast(ConvFactor as float),null)) 
      ,@To
 From  @Conversion 
 Where ConvUnit in(@From,@To)

Returns

2204.62262184878    pounds

Now, If you want ALL conversions for a value

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

Returns

终于明白了。抱歉我没有截图。我目前没有可用的项目。如果需要,请告诉我,我可以稍后添加。

您必须创建具有两个 UOM 维度 table 的多对多关系,一个从 UOM 维度 table 和一个到 UOM 维度 table 是相同的,具有 uom 转换 table在两者之间,每个方向的转换率都有一个条目。当 UOM 相同时,在事实转换 table 中包括单向转换率为 1 的转换,例如 ST 到 ST 的转换率为 1。

关系外键是这样的

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

创建这个之后,然后在关系用法选项卡中设置多对多,然后设置一个度量表达式来乘以您的转化率。

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