我有一個銷售事實表,並且銷售可以以不同的重量單位發生: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
返回