2013-03-06 118 views
2

我最近在SQL Server 2008分析服務多維數據集中遇到了一個問題。想象一下,你有一個簡單的銷售數據倉庫,有訂單和產品。每個訂單可以與幾個產品相關聯,每個產品可以包含在幾個訂單中。因此,數據倉庫至少由三個表組成:一個用於產品,一個用於訂單,一個用於參考表,用於建立兩者之間的n:n關係。 我希望我們的立方體回答的問題是:有多少訂單同時包含產品x和產品y? 在SQL中,這是很容易:MDX中的交叉點

select orderid from dbo.OrderRefProduct 
where ProductID = 1 
intersect 
select orderid from dbo.OrderRefProduct 
where ProductID = 3 

因爲我在SQL相當精通,但在MDX一個新手,我一直無法實現,在MDX。我已經嘗試使用不同的計數度量,MDX函數intersectnonempty以及subcubes。我也嘗試在邏輯上覆制維度(通過將維度添加到多維數據集兩次)以及物理上(通過複製數據源表和維度)。

http://www.zeitz.net/thts/intersection.zip上,您可以下載一個25kB大小的zip文件,其中包含一個帶有一些測試數據的SQL腳本以及使用這些表的Analysis Services解決方案。

我們正在使用SQL Server 2008 R2及其Analysis Services對象。性能考慮並不重要,因爲數據量與該立方體中包含的其他度量值(數十億行)相比數據量相當低(數百萬行)。

最終目標是能夠在標準OLAP中使用所需的功能(自定義計算的度量都可以),因爲Excel是我們的主要前端,我們的客戶希望從維度列表中選擇他們的產品並獲得立方體度量的正確結果。但即使是獨立工作的MDX-Query也會大有幫助。

謝謝!

編輯3月12日 我錯過了什麼或不能解決這個問題嗎?

如果它有助於構建mdx,下面是使用subquerys在sql中獲得結果的另一種方法。它可以進一步嵌套。

select distinct b.orderid from 
(
select distinct orderid from dbo.OrderRefProduct 
where ProductID = 1 
) a 
join dbo.OrderRefProduct b on (a.orderid = b.orderid) 
where ProductID = 3 

我在mdx中嘗試了類似於subcubes的東西,但沒有成功。

回答

3

我了個去 - 你可以從這裏下載我的解決方案:

http://sdrv.ms/YWtMod

我加你的事實表的副本作爲「交叉引用」,別名的產品1維度一個「交叉引用」,將維度引用設置爲獨立於現有關係的產品,並指定多對多關係。

它在Excel中返回正確答案(附帶示例)。

您可以根據需要多次擴展該模式。

祝你好運! 邁克

+0

它的工作原理!太棒了。給我一兩天來完全理解你實際做了什麼:-D – 2013-03-12 12:52:51

+0

有一個小問題:我設法擴展解決方案,以便使用3個產品維度(其中2個交叉引用,就像你一樣),這個完美的作品。現在,當用戶(並且我們確實有這種類型的用戶)選擇交叉引用維度product2和product3中的產品,但保留主產品 - dimnension product1時,結果是錯誤的。在這種情況下,我們可以使用多維數據集計算來強制輸出null,但有沒有辦法使它正確計算?如有必要,我可以爲這種情況提供解決方案+ excel文件。 – 2013-03-13 10:34:44

+0

在「維用途」選項卡上,常規關係應僅存在於一個交叉引用事實和維度對中,即您不應該在交叉引用事實和維度的同一列或行中具有多個常規關係。 – 2013-03-14 02:17:10

0

的其他方式來處理這SQL(我知道它的工作原理,但我沒有測試此查詢)是使用雙重否定

select distinct orderid 
from X 
where TK NOT in (
    select TK 
    from X x_alias 
    where productid NOT in (id1,id2) 
) 

我敢肯定,你可以做在MDX中也是一樣。

+0

問題是要求MDX查詢,而不是親愛的。 – CleanBold 2017-04-10 14:40:36