2014-07-14 23 views
0

我剛開始使用SSAS,我試圖創建一個數據立方體,該數據立方體允許我生成每季度特定年齡段人數的圖表,跨越一個數字多年。例如:使用SSAS的年齡段的基於時間段的圖

    | $  @$   $ 
Number of people | # $  @$   #@$ 
       | #@$  #@$   #@$ 
       +------------------------------ 
        2010 Q1 2010 Q2 ... 2014 Q1 

其中#是10-20歲的人,@是年齡在20-30歲之間的人,而$是30-40歲的人。

我發現的問題是,2010年有人可能是29歲,因此會落入20-30歲年齡段,但在2014年,我希望同一人計入30-40歲年齡段,因爲他現在會是33.我不知道如何(或者甚至有可能)創建一個對日期和時間敏感的維度?

+0

你如何得到年齡信息?您是否有一個包含生日的人物維度或(假設有隱私問題的)出生年份,您可以從中計算某個日期的(估計)年齡? – FrankPl

+0

嗨,是的,我有一個出生日期可以從中計算出來。 – Anupheaus

回答

0

構建它到模型

只要正確模擬的:假設你有一個包含措施您分析和外鍵對一個人的尺寸以及日期維度事實表,添加一個新表包含您要分析的範圍的「年齡組」維度。這個表格將包含e。 G。一個記錄「0-9」,一個「10-19」等。

然後將引用年齡段維度的外鍵列添加到事實表中。然後,設置此外鍵的值將是事實表上的SQL更新語句,它計算外鍵引用日期維度的日期與外鍵引用的人員的出生日期之間的差異。這種差異是當時的年齡。由此確定年齡組並將其主鍵用作外鍵列的值。

最後,只需從年齡段維度的年齡段列中創建一個屬性即可。

計算它的飛行

如果你真的要來計算上的蒼蠅,我不知道的表現還是不錯的,但你可以如下嘗試: 您需要的「年齡組「維度。但是沒有必要將它鏈接到你的事實表。然後定義計算成員如下:

member [Measures].[Age at Date] AS 
     DateDiff('yyyy', 
       [Person].[BirthDate].CurrentMember.Properties("Key0", TYPED), 
       Measures.[Date] 
       ) 
Member [Measures].[Person Count per Age Group] AS 
     CASE 
      WHEN [Age Group].[Age Group].CurrentMember is [Age Group].[Age Group].[0-9] THEN 
       Filter([Person].[Person Id].[Person Id].Members, 
         [Measures].[Age at Date] >= 0 AND [Measures].[Age at Date] < 10 
        ).Count 
      WHEN [Age Group].[Age Group].CurrentMember is [Age Group].[Age Group].[10-19] THEN 
       Filter([Person].[Person Id].[Person Id].Members, 
         [Measures].[Age at Date] >= 10 AND [Measures].[Age at Date] < 20 
        ).Count 
      ... 
     END 

這是假設你有每條記錄的一個直接在事實表命名Measures.[Date]措施的日期。如果情況並非如此,則可以將日期作爲日期數據類型,可能來自日期維度的當前成員,類似於出生日期是如何通過Key0屬性派生的。我假設您在出生日期屬性鍵的維度中確實使用了Date數據類型,否則,可能需要進行類型轉換。出於這樣的目的,Analysis Services中有許多VBA函數(如上面使用的DateDiff),如documented here

+0

我希望SSAS能夠在飛行中完成這項工作,而不是在非常大的事實表中生成數據。問題是有很多員工和數年的數據。這個事實表將是巨大的! – Anupheaus

+0

@Anupheaus我不認爲你需要增加太多的桌子大小。由於您確實擁有少於255個年齡段,因此您可以使用tinyint類型的主鍵和外鍵列。即使對於大公司,我也認爲你們的員工不到一百萬。所以對於50年的數據,你將有200個季度,100萬次,你會得到200兆字節(加上一些開銷取決於存儲的細節)。即使你使用int而不是tinyint,你也會增加四倍200 MB,即i。即大約1 GB,我不會假設巨大。 – FrankPl

+0

我需要能夠鑽取數月。最終,如果SSAS不能用一些計算的計算來實現這一點,那麼除非你知道可以允許SSAS在飛行中這樣做的計算,否則我會將其標記爲答案(因爲它不能以其他方式完成)。 – Anupheaus