2

最近、SQL Server 2008 AnalysisServicesCubeで問題が発生しました。注文と製品を含む単純な販売データウェアハウスがあるとします。各注文は複数の製品に関連付けることができ、各製品は複数の注文に含めることができます。したがって、データウェアハウスは少なくとも3つのテーブルで構成されます。1つは製品用、1つは注文用、もう1つは参照テーブル用で、両方の間のn:n関係をモデル化します。キューブに答えてほしい質問は、製品xと製品yの両方を含む注文がいくつあるかということです。SQLでは、これは簡単です。

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

私はSQLにかなり精通していますが、MDXの初心者であるため、MDXでそれを実装することはできませんでした。個別のカウントメジャー、MDX関数およびサブキューブを使用してみintersectましnonemptyた。また、ディメンションを論理的に(キューブに2回追加することにより)、物理的に(データソーステーブルとディメンションを複製することにより)複製してみました。

http://www.zeitz.net/thts/intersection.zipで、25kBサイズのzipファイルをダウンロードできます。このファイルには、いくつかのテストデータを含むSQLスクリプトと、テーブルを使用したAnalysisServicesソリューションが含まれています。

SQL Server2008R2とそれに対応するAnalysisServicesを使用しています。そのキューブに含まれる他のメジャーグループ(数十億行)と比較してデータ量がかなり少ない(数百万行)ため、パフォーマンスの考慮事項はそれほど重要ではありません。

最終的な目標は、Excelが主要なフロントエンドであり、顧客がディメンションリストから製品を選択して正しい結果を取得したいため、標準のOLAPで目的の機能を使用できるようにすることです(カスタム計算メジャーは問題ありません)。キューブは測定します。しかし、スタンドアロンのMDX-Queryが機能していても、非常に役立ちます。

ありがとうございました!

3月12日編集 私は何かを逃したのですか、それともこれをどうにかして解決できないのですか?

mdxの構築に役立つ場合は、サブクエリを使用して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のサブキューブでこのようなことを試しましたが、うまくいきませんでした。

4

2 に答える 2

3

私は試してみました-あなたはここから私の解決策をダウンロードすることができます:

http://sdrv.ms/YWtMod

ファクトテーブルのコピーを「相互参照」として追加し、Product1ディメンションを「相互参照」としてエイリアスし、既存のリレーションシップから独立してディメンションリファレンスをProductに設定し、多対多のリレーションシップを指定しました。

Excelで正解を返しています(サンプル添付)。

そのパターンを必要な回数だけ拡張できます。

幸運を!マイク

于 2013-03-12T10:52:46.737 に答える
0

SQLでこれを処理する別の方法(動作することはわかっていますが、このクエリはテストしていません)は、二重否定を使用することです。

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

MDXでも同じことができると確信しています。

于 2013-03-15T07:39:20.540 に答える