看到漂漂亮亮的PowerBI報表,手癢癢怎么辦?!
有沒有面對着稀奇古怪的DAX而感到有點丈八金剛摸不着頭腦或者干瞪眼?!
有沒有想得到某個值想不出來DAX怎么寫而直跳腳!?
看完這篇文章,你會恍然大悟,捂臉偷笑。呼呼呼~
前言:
這篇文章對於具有一點SQL查詢基礎人會十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等。
注:此文不涉及到Filter Context(篩選上下文)的介紹。
正文:
對於對SQL有一定了解的人來說,咋看DAX,怎么都不習慣。 但是,如果理解以下幾個后,DAX學起來就得心應手一些。
- SUMMARIZE
- FILTER
- CALCULATE 與 CALTULATETABLE
注:這里不會對這些語法詳細的講解,而是從SQL的角度,看看那些DAX的等價相似語句。
歡迎轉載,請保留原文鏈接和作者信息。O(∩_∩)O謝謝。 DAX基礎 - 30分鍾掌握從SQL到DAX 作者:馬丁叔叔
鏈接:http://www.cnblogs.com/lizardbi/p/DAX-FOUNDATION-DAX-FOR-SQL-DEVELOPER-IN-30-MINUTES.html
先來看一個例子,
查詢Products表里的所有行:
DAX |
SQL |
-- list all the Products |
show all the Products SELECT * FROM tblProduct |
DAX Filter vs SQL Filter
DAX | SQL |
EVALUATE FILTER ( Product, RELATED ( Category[Product Category Name] ) = "Bike" ) |
SELECT * FROM Product P JOIN Category c on P.[Category_KEY] = c.[Category_KEY] WHERE c.[Product Category Name] = 'Bikes' |
FILTER是一個MUST know的語句
從Transaction表中統計銷售數目 - SUM-GRUOP BY:
DAX | SQL |
-- 顯示每個產品銷售數目 EVALUATE SUMMARIZE ( 'Transaction', 'Transaction'[ProductId], "Total qty", SUM ( 'Transaction'[Quantity] ) ) |
-- 顯示每個產品銷售數目 SELECT ProductId, SUM(Quantity) AS 'Total Qty' |
SUMMERIZE
選擇一個表中指定的列:
DAX | SQL |
-- list selected columns
EVALUATE
SUMMARIZE(
Product,
Product[Name], Product[Size])
|
-- show selected columns
SELECT
Name,
Size
FROM tblProduct
|
排序:
DAX | SQL |
-- show products in name order
EVALUATE
Product
ORDER BY Product[ProductName]
|
-- show products by name
SELECT *
FROM tblProduct
ORDER BY ProductName
|
選擇前幾行:
DAX | SQL |
-- show 5 most expensive products EVALUATE TOPN ( 5, Product, Product[FullPrice] ) |
SELECT TOP 5 FROM Product
|
SUMMERIZE vs Group BY
SUMMARIZE是一個比較重要語句:
記住:這個跟SQL極為相似,學習過程中只要想想SQL就容易理解很多了。
EVALUATE SUMMARIZE( 源表名, Group by 列 1, ..., Group by 列 N, 匯總列名1, 匯總列名1所對應的表達式, ..., 匯總列名N, 匯總列名N所對應的表達式 )
再來一個例子:
對產品的分類,顏色,產品名字進行統計:交易單量,銷售數目
MSDN的例子
DAX |
SQL |
EVALUATE
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] F JOIN 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] |
Date[Calendar Year] | Product Category[Product Category Name] | [Sales Amount] | [Discount Amount] |
---|---|---|---|
2005 | Bikes | 6958251.043 | 4231.1621 |
2006 | Bikes | 18901351.08 | 178175.8399 |
2007 | Bikes | 24256817.5 | 276065.992 |
2008 | Components | 2008052.706 | 39.9266 |
... | ... | ... | ... |
等價的SQL如下,如果你只看淺藍色的部分,是不是很好理解呢?
SUMMARIZE還有其他的Option,這里就不做詳細介紹。
SUMMARIZE詳情參考:https://msdn.microsoft.com/en-us/library/gg492171.aspx
CALCULATETABLE vs Sub Query
下面語句統計Bike這個類別的產品的銷售數目。
DAX | SQL |
EVALUATE 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]
|
上述的SQL語句有很多種寫法。
高亮部分CalculateTable里面篩選了Bikes這個類別,正如SQL的sub Query一樣。
DAX ADDCOLUMNS vs SQL Derived Column
注:ADDCOLUMNS跟Calculated Column類似:即給指定的表加入計算列。不一樣的地方在於Addcolumn所加的只在它所在的語句有效。
DAX | SQL |
EVALUATE ADDCOLUMNS ( 'Product Category', "Number transactions", COUNTROWS ( RELATEDTABLE ( 'Internet Sales' ) ) )
|
SELECT [Product Category Name], count(t.Id) AS 'Number transactions' FROM Transaction F JOIN [Product Category] C on F.[Category_Key] = C.[Category_Key] GROUP BY C.[Product Category Name]
|
小結:
DAX語法十分靈活,有些看起來晦澀難懂,但是,如果能夠以SQL為基礎的角度去切入會事半功倍。
還有,此文沒有介紹的上下文(Filter Context)是一個重要的概念,如果要真正掌握DAX和一些高級的用法,深刻理解上下文是必須的。
希望有時間好好講講這個。
歡迎交流與騷擾