DAX基础入门 - 30分钟从SQL到DAX -- PowerBI 利器
看到漂漂亮亮的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和一些高级的用法,深刻理解上下文是必须的。
希望有时间好好讲讲这个。
欢迎交流与骚扰