如果我已經正確理解了您的問題,您已經創建了多個日期屬性(具有不同的邏輯含義),並且它們映射到日曆表的不同別名上。
直到用戶在他們的報告中使用不同的單一事實表時,沒有問題,但是當他們使用銷售和發票中的指標/事實時,您已經乘以結果,因爲「訂單日期」和「發票日期」是不同的屬性。
你的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將使用它從父屬性轉到事實表。
希望這可以幫助你擺脫泥濘。
喲寫的invoice_fact包含三個日期,但你只提及invice_date和actual_ship_date,你能澄清? – mucio
@mucio我更新了這個問題。謝謝! – Nick
檢查我的答案,我認爲你的意思是兩個 – mucio