2014-02-28 51 views
1

在我們的MicroStrategy 9.3環境中,我們有一個具有多個日期維度的星型模式。對於此示例,假設我們有一個order_fact表有兩個日期,order_date和ship_date,以及一個包含兩個日期invoice_date和actual_ship_date的invoice_fact表。我們有一個包含「日曆」相關數據的日期維度。根據MicroStrategy高級數據倉庫指南,我們使用別名設置每個日期,這是MicroStrategy推薦的處理角色扮演維度的方法。MicroStrategy - 加入動態屬性

現在的問題。別名日期允許用戶創建特定於已被別名的日期的報告。但是,由於日期已被別名,MicroStrategy將不會合並「日期」,因爲它們看起來不同。舉例來說,我不能輕鬆地在order_date和invoice_date上顯示訂單數量和發票數量的報告,因爲它會導致交叉連接。

我們在內部討論的解決方案是創建一個名爲order_fact_date和invoice_fact_date的新屬性。

case when <user picked date> = 'order date' 
    then order_date 
    else ship_date end as order_fact_date 

case when <user picked date> = 'invoice date' 
    then invoice_date 
    else actual_ship_date as invoice_fact_date 

我們的想法是的話,我們可以有映射到兩個日期的「一般」的日期維度這將使MicroStrategy的利用同一個表中加入:這些日期會在運行時通過下面的僞代碼確定從而消除交叉連接問題。

清澈如泥?

編輯1:將「三個日期」更改爲「兩個日期」。

+1

喲寫的invoice_fact包含三個日期,但你只提及invice_date和actual_ship_date,你能澄清? – mucio

+0

@mucio我更新了這個問題。謝謝! – Nick

+0

檢查我的答案,我認爲你的意思是兩個 – mucio

回答

0

如果我已經正確理解了您的問題,您已經創建了多個日期屬性(具有不同的邏輯含義),並且它們映射到日曆表的不同別名上。

直到用戶在他們的報告中使用不同的單一事實表時,沒有問題,但是當他們使用銷售和發票中的指標/事實時,您已經乘以結果,因爲「訂單日期」和「發票日期」是不同的屬性。

你的SQL看起來像:

... 
FROM order_fact a11 
INNER JOIN invoice_fact a12 
INNER JOIN lu_calendar a13 
     ON a11.order_date = a13.date_id 
INNER JOIN lu_calendar a14 
     ON a12.invoice_date = a14.date_id 
... 

像往常一樣有可能的解決方案,而不是所有的人都非常簡單。

選項1 - 單日期屬性

你在你的問題提這種可能性,而不是使用「訂購日期」和「發票日期」,只使用一個單一的「日期」的屬性,並指導用戶如何使用它。如果這可以讓他們的生活更輕鬆,你可以稱之爲「報告日期」或「操作日期」。

你應該得到的SQL是這樣的:

... 
FROM order_fact a11 
INNER JOIN invoice_fact a12 
     ON a11.order_date = a12.invoice_date 
INNER JOIN lu_calendar a13    -- Only one join 
     ON a11.order_date = a13.date_id -- because the date is the same 
... 

選擇2 - 我們需要保持兩個日期屬性!

在日曆表的同一個別名上映射「訂單日期」和「發票日期」。這通常會導致MicroStrategy出現問題,因爲兩個屬性將在同一個查找表中結合在一起[請參閱後面的內容],但在您的情況下,這正是您正在尋找的內容。

有了這個解決方案,您應該獲得類似這樣的SQL:

... 
FROM order_fact a11 
INNER JOIN invoice_fact a12   -- Hey! this is again a cross join! 
INNER JOIN lu_calendar a13 
     ON a11.order_date = a13.date_id  -- Relax man, we got you covered. 
     AND a12.invoice_date = a13.date_id -- Yes, we do it! 
... 

這是很好的,但如果你有說明的形式從日曆表來(這並不總是與日期,因爲情況下,它只能該ID通常也是您在報告中顯示的實際值)。如果你沒有與日曆查找一個連接,你的SQL將再次重複的結果結束了:

... 
FROM order_fact a11   -- Notice no join column between the two facts 
INNER JOIN invoice_fact a12 -- and no other conditions will help to join them 
... 

出於這個原因,如果你想保留這兩個屬性分開,在相同的映射他們身邊查找,你也應該:

  • 創建一個隱藏屬性(姑且稱之爲「Date_on_fact」),其映射的事實表和萬年曆錶,使之既有「訂購日期」和「發票日期」的孩子。
  • 從事實表中取消映射「訂單日期」和「發票日期」。

這裏的想法是給力的MicroStrategy始終使用SQL代碼總是日曆查找表:

... 
FROM order_fact a11 
INNER JOIN invoice_fact a12   -- This is like the previous one 
INNER JOIN lu_calendar a13   -- But I'm back to help you 
     ON a11.order_date = a13.date_id  
     AND a12.invoice_date = a13.date_id 
... 

屬性「Date_on_fact」實際上可以被隱藏,用戶不需要把它在他們的報告中,但MicroStrategy將使用它從父屬性轉到事實表。

希望這可以幫助你擺脫泥濘。

+0

是否有可能在運行時解決「date_on_fact」?正如我在*上面解釋的,不是很成功,我希望MicroStrategy能夠根據訂單事實加入訂單日期或發貨日期。發票表同樣如此。不知道我是否會混淆這個問題。 – Nick

+0

您不能讓MicroStrategy決定哪個列用於屬性。您可以進行自定義(複雜),也可以爲所有可能的日期組合創建過濾器(如「訂單日期」=「發票日期」),並在需要時將其添加到報告中,但當然這需要用戶知道這些過濾器並知道如何使用它們 – mucio

0

我們遇到了同樣的問題。 我們必須爲此創建通用時間層次結構,並將通用時間層次結構連接到不同的發票和訂單時間層次結構。

它的作品像魅力!

+0

你能詳細說明這一點嗎?您是否將通用的「日期」層次映射到所有特定的角色播放維度? – Nick