Sql-Server

T-SQL 和 MDX 之間最相關的相似之處是什麼?

  • December 7, 2017

我使用過 T-SQL(CTE、視窗函式、遞歸 CTE、大數據、表值函式、APPLY、PIVOT、儲存過程等),但從未查詢過 Microsoft SSAS 多維數據集。

對於以下 T-SQL 概念,MDX 中是否存在類似的概念?

  • 反透視
  • 視窗函式
  • 遞歸公用表表達式

使用 MDX 的 T-SQL 使用者有什麼陷阱嗎?

我希望 T-SQL 和 MDX 之間有一些共同的類比,這將有助於擅長 T-SQL 的人過渡到 MDX。

如果有從 T-SQL 到 MDX 時所犯常見錯誤的指南,那也很棒。

一般注意事項

首先,T-SQL 和 MDX 是兩種完全不同的野獸。SQL 旨在查詢表格關係數據,而 MDX 旨在查詢多維數據。

我將從解決您關於常見錯誤的問題開始。在我看來,最常見的錯誤是嘗試將 SQL 知識應用於 MDX。你真的需要進入多維思維模式,忘記在關係結構中思考。

例如,您不查詢列和行,而是對維度和度量進行切片。例如,請參見我的答案

MDX 中幾乎唯一類似於 SQL 的事實是您有 a SELECTand a FROMand aWHERE子句,但 MDX 不一定返回行和列,而是返回“軸”,其中您可以擁有超過 2 個。

解決你的一些觀點可能會告訴你為什麼 SQL 概念不映射到 MDX 概念:

樞軸和反樞軸

您幾乎不會在 MDX 中執行此操作。如果您查看MDX 選擇語法,您會看到這樣的範例(在這種情況下返回二維結果):

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]  

請記住,COLUMNSROWS軸只是簡寫名稱,您也可以這樣做:

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

並添加第三個軸和第四個軸,如果您願意(並且如果您的客戶端支持渲染),則結果不是表格,而是多維單元集。

顯然,當您的結果集中有超過 2 個軸時,pivot 和 unpivot 將無法跟上。

遞歸 CTE

由於 MDX 不返回“表”,因此沒有表表達式之類的東西。如果這是您需要的,您可以在計算的度量中進行遞歸。

當您遇到WITH關鍵字時,它正在定義Query-Scoped Calculated Members

視窗函式

視窗函式在 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 方言。

引用自:https://dba.stackexchange.com/questions/192449