DAX基礎入門 - 30分鍾從SQL到DAX -- PowerBI 利器


看到漂漂亮亮的PowerBI報表,手癢癢怎么辦?!

有沒有面對着稀奇古怪的DAX而感到有點丈八金剛摸不着頭腦或者干瞪眼?!

有沒有想得到某個值想不出來DAX怎么寫而直跳腳!?

看完這篇文章,你會恍然大悟,捂臉偷笑。呼呼呼~

 

前言:

這篇文章對於具有一點SQL查詢基礎人會十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等。

 

 注:此文不涉及到Filter Context(篩選上下文)的介紹。

 

正文:

對於對SQL有一定了解的人來說,咋看DAX,怎么都不習慣。 但是,如果理解以下幾個后,DAX學起來就得心應手一些。

  • SUMMARIZE
  • FILTER
  • CALCULATE 與 CALTULATETABLE

注:這里不會對這些語法詳細的講解,而是從SQL的角度,看看那些DAX的等價相似語句。

 

 

先來看一個例子,

查詢Products表里的所有行: 

 DAX
SQL
-- list all the Products
EVALUATE Product
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' 
FROM tblTransaction
GROUP BY ProductId

 

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 
ORDER BY FullPrice

 

SUMMERIZE vs Group BY

SUMMARIZE是一個比較重要語句:

記住:這個跟SQL極為相似,學習過程中只要想想SQL就容易理解很多了。

 

EVALUATE 
SUMMARIZE( 
      源表名, 
      Group by1, 
      ...,
      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]
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 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和一些高級的用法,深刻理解上下文是必須的。

希望有時間好好講講這個。

 

歡迎交流與騷擾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM