2016-12-21 107 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