最近、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のサブキューブでこのようなことを試しましたが、うまくいきませんでした。