多对多单位转换 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。
关系外键是这样的
- 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
我有一个销售事实 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。
关系外键是这样的
- 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