none
複雑な集計結果からドリルスルー RRS feed

  • 質問

  •    

            あるMDXの集計結果を書きます。

       

             

                                                                                                                                                                                                                           
                    Dim_1.名前                Dim_2.名前\Measure_1                Pass Cnt
                    あ                A                72
                    あ                B                2400
                    い                C                40000
       

             

       

            これで特定のセル、例えばDim_1='あ',Dim_2='A'のドリルスルーは

       

            DRILLTHROUGH SELECT{
        ([Dim_1].[名前].[あ],[Dim_2].[名前].[A])
            }ON COLUMNS FROM[キューブ名]
            RETURN [Measure_1].[表示したい列]

       

            で表示できます。
            もうひとつ、ここで取得できた3つのPass Cntセルのドリルスルーは

       

            DRILLTHROUGH SELECT{
        ([Dim_1].[名前].[ALL],[Dim_2].[名前].[ALL])
            }ON COLUMNS FROM[キューブ名]
            RETURN [Measure_1].[表示したい列]

       

            で取得できます。問題は次の条件です。
            Dim_1='あ'AND Dim_2='A'OR Dim_1='あ'AND Dim_2='B'の2つのMeasure_1のドリルスルーはどのようにDRILLTHROUGHを記述すればよいのでしょうか?
            MDXの書き方の問題かもしれませんが分かりません。
            どうかご教授お願いします。
            ずっとMDXのリファレンスを見ているのですが非常に難しくちょっとしたことを実現する方法がわかりません。

    2008年7月10日 7:20

回答

  •  Dim_1='あ'AND Dim_2='A'OR Dim_1='あ'AND Dim_2='B'の2つのMeasure_1のドリルスルーは

    どのようにDRILLTHROUGHを記述すればよいのでしょうか?

    上の結果から見る限りでは単純に、

    Code Snippet

    SELECT { (Dim_1].[名前].[あ]) } ON 0

     

    だけで良い様な気がします([Dim_1]の[あ]と交わる[Dim_2]に[ A ], [ B ]以外に結果が存在しない場合)。

     

    但し、[Dim_2]の[ A ], [ B ]以外に[ C ]...が存在すると仮定して、[ A ], [ B ]が返すドリルスルーの

    テーブルの和(UNION)?を取得するのであれば恐らくは2回のクエリに分けなければならない

    と思われます。

     

    >> DRILLTHROUGH を使用したソース データの取得 (MDX)

    > http://technet.microsoft.com/ja-jp/library/ms146029.aspx

     

    以下は上記より引用

    この SELECT 句は MDX の通常の SELECT ステートメントとほぼ同じですが、

    SELECT 句の場合、それぞれの軸上で 1 つのメンバだけを指定できます。

    1 つの軸で複数のメンバが指定されている場合、エラーが発生します。

     

     

    (追記) 一部説明を補足しました。

    (修正) 誤り箇所を赤で訂正しました。

     

    2008年7月14日 0:55
  • 動作確認はしてませんが、多分いけるんぢゃないかと思ってます。

     

    そこら辺はプログラム側で処理することにします。上手い方法があればいいのですが。

    プログラムでの小手先な方法になります。

     

    Code Snippet

    DataTable dt = new DataTable();

    cmd.CommandText = << Drill Through MDX >>;


    using (AdomdDataAdapter da = new AdomdDataAdapter(cmd))
    {
        da.Fill(dt);
    }

    cmd.CommandText = << Drill Through MDX >>;
    using (AdomdDataAdapter da = new AdomdDataAdapter(cmd))
    {
        da.Fill(dt);
    }

     

    DataView dv = dt.DefaultView;
    DataTable dt_distinct = dv.ToTable(true, << columns >>);

     

    データテーブルに追加しておいて、ToTable()に重複列を省く、という動きになるかと思います。

     

    (修正) AdomdDataAdapter → daに修正、adと誤記してました。

     

     

    (追記) MSDN側読んでて気がつかなかったですが、ToTable()の第2引数がparams指定になっていて

    略すことができるっぽいので、以下で十分なようです。

     

    Code Snippet

    DataTable dt_distinct = dv.ToTable(true);

     

    2008年7月15日 3:00

すべての返信

  •  Dim_1='あ'AND Dim_2='A'OR Dim_1='あ'AND Dim_2='B'の2つのMeasure_1のドリルスルーは

    どのようにDRILLTHROUGHを記述すればよいのでしょうか?

    上の結果から見る限りでは単純に、

    Code Snippet

    SELECT { (Dim_1].[名前].[あ]) } ON 0

     

    だけで良い様な気がします([Dim_1]の[あ]と交わる[Dim_2]に[ A ], [ B ]以外に結果が存在しない場合)。

     

    但し、[Dim_2]の[ A ], [ B ]以外に[ C ]...が存在すると仮定して、[ A ], [ B ]が返すドリルスルーの

    テーブルの和(UNION)?を取得するのであれば恐らくは2回のクエリに分けなければならない

    と思われます。

     

    >> DRILLTHROUGH を使用したソース データの取得 (MDX)

    > http://technet.microsoft.com/ja-jp/library/ms146029.aspx

     

    以下は上記より引用

    この SELECT 句は MDX の通常の SELECT ステートメントとほぼ同じですが、

    SELECT 句の場合、それぞれの軸上で 1 つのメンバだけを指定できます。

    1 つの軸で複数のメンバが指定されている場合、エラーが発生します。

     

     

    (追記) 一部説明を補足しました。

    (修正) 誤り箇所を赤で訂正しました。

     

    2008年7月14日 0:55
  • >上の結果から見る限りでは単純に、~

    あ、すいません。意図としては任意のセルのドリルスルー結果を繋げて取得したいということです。

    >テーブルの和(UNION)?を取得するのであれば恐らくは2回のクエリに分けなければならない

    と思われます。


    単純だが最もだと思いました。さっそくセルの数だけクエリを実行して取得しました。
    ただ同じ結果を取得したとき重複は除きたいです。そこら辺はプログラム側で処理することにします。上手い方法があればいいのですが。

    とりあえず目的の動作は達成できました。
    st.lain さんありがとうございました。
    2008年7月14日 4:39
  • 動作確認はしてませんが、多分いけるんぢゃないかと思ってます。

     

    そこら辺はプログラム側で処理することにします。上手い方法があればいいのですが。

    プログラムでの小手先な方法になります。

     

    Code Snippet

    DataTable dt = new DataTable();

    cmd.CommandText = << Drill Through MDX >>;


    using (AdomdDataAdapter da = new AdomdDataAdapter(cmd))
    {
        da.Fill(dt);
    }

    cmd.CommandText = << Drill Through MDX >>;
    using (AdomdDataAdapter da = new AdomdDataAdapter(cmd))
    {
        da.Fill(dt);
    }

     

    DataView dv = dt.DefaultView;
    DataTable dt_distinct = dv.ToTable(true, << columns >>);

     

    データテーブルに追加しておいて、ToTable()に重複列を省く、という動きになるかと思います。

     

    (修正) AdomdDataAdapter → daに修正、adと誤記してました。

     

     

    (追記) MSDN側読んでて気がつかなかったですが、ToTable()の第2引数がparams指定になっていて

    略すことができるっぽいので、以下で十分なようです。

     

    Code Snippet

    DataTable dt_distinct = dv.ToTable(true);

     

    2008年7月15日 3:00
  • DataViewは使ってましたが、
    da.Fill(dt);
    とかけること知りませんでした。dt.Rows.Add...という感じでやってたもので。
    これはスマートですね!使わせていただきます。
    2008年7月15日 4:02
  • こんにちは。中川俊輔 です。

     

    st.lainさん、回答ありがとうございます。

     

    和和和さん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、st.lainさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    和和和さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年7月28日 7:36