web-dev-qa-db-ja.com

T-SQLとMDXの最も関連性の高い類似点は何ですか?

T-SQL(CTE、ウィンドウ関数、再帰CTE、大規模データ、テーブル値関数、APPLY、PIVOT、ストアドプロシージャなど)を使用したことがありますが、MicrosoftSSASキューブを照会したことはありません。

次のT-SQLの概念について、MDXに同様の概念がありますか?

  • ピボット
  • UNPIVOT
  • ウィンドウ関数
  • 再帰共通テーブル式

MDXを使用するT-SQLユーザーにとっての落とし穴はありますか?

T-SQLとMDXの間にいくつかの一般的な類似点があり、T-SQLからMDXへの移行が得意な人に役立つことを願っています。

また、T-SQLからMDXに移行するときによくある間違いのガイドがあれば素晴らしいと思います。

2
Edmund

一般的注意事項

まず第一に、T-SQLとMDXは2つの完全に異なる獣です。 SQLは表形式のリレーショナルデータをクエリすることを目的としていますが、MDXは多次元データをクエリすることを目的としています。

よくある間違いについてのあなたの質問に答えることから始めましょう。私の意見では、最も一般的な間違いは、SQLの知識をMDXに適用しようとすることです。あなたは本当に多次元の考え方に入り、関係構造で考えることを忘れる必要があります。

たとえば、列と行をクエリするのではなく、ディメンションとメジャーをスライスします。たとえば ここでの私の答え を参照してください。

SQLに似ているMDXのほとんど唯一のことは、SELECTFROMWHERE句があるという事実ですが、MDXは必ずしも行と列を返すとは限りません。ただし、「軸」を返します。そのうちの2つ以上を使用できます。

いくつかのポイントに取り組むことで、SQLの概念がMDXの概念にマッピングされない理由がわかるでしょう。

ピボットとアンピボット

MDXではほとんどこれを行いません。 MDX select構文 を見ると、次のような例が表示されます(この場合は2次元の結果が返されます)。

SELECT   
    [Date].[Calendar].[First8Months2003] ON COLUMNS,  
    [Product].[Category].Children ON ROWS  
FROM  
    [Adventure Works]  
WHERE  
    [Measures].[Order Quantity]  

たとえば、その結果セットをピボットしたい場合は、軸を入れ替えるだけです。

SELECT   
    [Product].[Category].Children ON COLUMNS,  
    [Date].[Calendar].[First8Months2003] ON ROWS  
FROM  
    [Adventure Works]  
WHERE  
    [Measures].[Order Quantity]  

COLUMNS軸とROWS軸は単なる省略名であることに注意してください。また、次のこともできます。

SELECT   
    [Product].[Category].Children ON 0,  
    [Date].[Calendar].[First8Months2003] ON 1  
FROM  
    [Adventure Works]  
WHERE  
    [Measures].[Order Quantity]  

必要に応じて(クライアントがレンダリングをサポートしている場合)、3番目の軸と4番目の軸を追加して、結果がテーブルではなく多次元セルセットになるようにします。

明らかに、結果セットに3つ以上の軸がある場合、ピボットとアンピボットは追いつきません。

再帰的CTE

MDXは「テーブル」を返さないため、テーブル式などはありません。それが必要な場合は、 計算されたメジャーの再帰 を持つことができます。

WITHキーワードに遭遇すると、それは クエリスコープの計算されたメンバー を定義します。

ウィンドウ関数

ウィンドウ関数は、キューブですでに計算されているものと計算されたメジャーを計算するために使用されるため、MDXでも使用できません。 OVER句は、ほとんどの場合、軸に配置するディメンションメンバーです。

たとえば、現在の合計を考えてみましょう。 SQLでは、次の行に沿って何かを記述します。

SELECT SUM(internet_sales) OVER (ORDER BY date) AS running_total
FROM sales;

ただし、MDXでは、カレンダーディメンションと売上高メジャーがあり、MDXは次のようになります。

WITH MEMBER [Measures].[Sum from start]
AS
SUM ({NULL:[Date].[Calendar].CurrentMember},
[Measures].[Internet Sales Amount])
SELECT {[Measures].[Internet Sales Amount],[Measures].[Sum from start]} ON 0 ,
[Date].[Calendar].[Calendar Year].MEMBERS ON 1
FROM [Adventure Works]

結論

ご覧のとおり、T-SQLの原則を適用してMDXの問題を解決しようとすると、問題が発生する可能性があります。

MDXを学習したい場合は、MDXをまったく新しい言語であり、新しい構文ではないかのように学習する必要があります。これは、SQL方言ではなく、別の言語であるためです。