前言:
這篇文章對於具有一點SQL查詢基礎人會十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等。
注:此文不涉及到Filter Context(篩選上下文)的介紹。
正文:
對於對SQL有一定了解的人來說,咋看DAX,怎麼都不習慣。 但是,如果理解以下幾個後,DAX學起來就得心應手一些。
SUMMARIZE
FILTER
CALCULATE 與 CALTULATETABLE
注:這裏不會對這些語法詳細的講解,而是從SQL的角度,看看那些DAX的等價相似語句。
先來看一個例子,
查詢Products表裏的所有行:
表 ='tblProduct' SELECT *FROM tblProduct [object Object]
DAX Filter vs SQL Filter
DAX:
FILTER ( Product, RELATED ( Category[Product Category Name] ) = "Bike")
SQL:
SELECT * FROM Product PJOIN Category c on P.[Category_KEY] = c.[Category_KEY]WHERE c.[Product Category Name] = 'Bikes' FILTER是一個MUST know的語句
從Transaction表中統計銷售數目 - SUM-GRUOP BY:
DAX
-- 顯示每個產品銷售數目 SUMMARIZE ('Transaction','Transaction'[ProductId], "Total qty", SUM ( 'Transaction'[Quantity] ) )
-- 顯示每個產品銷售數目
(Quantity) ProductId
SUMMERIZE
選擇一個表中指定的列:
dax
SUMMARIZE( Product, Product[Name], Product[Size])
SELECT Name, Size FROM tblProduct 選擇前幾行: TOPN ( 5, Product, Product[FullPrice] ) TOP3 = TOPN(3,SUMMARIZE('訂單表','訂單表'[create_time],"Sale Amount",sum('訂單表'[amount])),[Sale Amount]) //返回表的值,需要添加表 select * from Product LIMIT 5
SUMMARIZE是一個比較重要語句:
記住:這個跟SQL極爲相似,學習過程中只要想想SQL就容易理解很多了。
SUMMARIZE( 源表名, Group by 列 1, ..., Group by 列 N, 彙總列名1, 彙總列名1所對應的表達式, ..., 彙總列名N, 彙總列名N所對應的表達式 )
再來一個例子:
對產品的分類,顏色,產品名字進行統計:交易單量,銷售數目
MSDN的例子
DAX:
SUMMARIZE('Internet Sales' , ROLLUP('Date'[Calendar Year], 'Product Category'[Product Category Name]) , "Sales Amount", SUM('Internet Sales'[Sales Amount]) , "Discount Amount", SUM('Internet Sales'[Discount Amount]) ) SELECT D.[Calendar Year], PC.[Product Category Name] , SUM(F.[Sales Amount]) 'Sales Amount' , SUM(F.[Discount Amount]) 'Discount Amount'FROM [Internet Sales] FJOIN DATE D ON S.[DAY_KEY] = F.[DAY_KEY]JOIN [Product Category] PC ON PC.[Category_KEY] = F.[Category_KEY]GROUP BY D.[Calendar Year],PC.[Product Category Name]
等價的SQL如下,如果你只看淺藍色的部分,是不是很好理解呢?
SUMMARIZE還有其他的Option,這裏就不做詳細介紹。
SUMMARIZE詳情參考:https://msdn.microsoft.com/en-us/library/gg492171.aspx
CALCULATETABLE vs Sub Query
下面語句統計Bike這個類別的產品的銷售數目。
SUMMARIZE ( CALCULATETABLE ('Internet Sales', 'Product Category'[Product Category Name] = "Bikes" ), -- field to group by Product[Product Name],"Quantity sold",SUM( 'Internet Sales'[Order Quantity] ) ) SELECT P.[Product Name], SUM(Fact.[Quantity]) as 'Quantity sold' FROM (SELECT F.* FROM [Transaction] F JOIN Category c ON F.[Category_Key] = C.[Category_Key] WHERE C.[Product Category Name] = 'Bikes' ) Fact join Product P ON P.[Product_Key] = Fact.[Product_Key] GROUP BY P.[Product Name] 上述的SQL語句有很多種寫法。
高亮部分CalculateTable裏面篩選了Bikes這個類別,正如SQL的sub Query一樣。
小結:
DAX語法十分靈活,有些看起來晦澀難懂,但是,如果能夠以SQL爲基礎的角度去切入會事半功倍。
還有,此文沒有介紹的上下文(Filter Context)是一個重要的概念,如果要真正掌握DAX和一些高級的用法,深刻理解上下文是必須的。