![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-30-49.jpg)
没有爱上车是因为还没学会驾驶。
前情回顾
在上一篇DAX查询入门:DAX Studio介绍中,我们已经初步了解了DAX Stuido。
它提供的能力包括:
- DAX查询编写
- DAX查询/DAX代码格式化
- 数据模型元数据查看
- 当前DAX引擎支持函数查看
- 当前DAX引擎DMV
- DAX查询结果查看
- DAX查询结果数据导出
- DAX引擎运行监控(为代码优化做准备)
- DAX引擎时间跟踪
- DAX代码性能优化
我们初步了解了: - Excel透视表可以用等效的DAX查询表示
- DAX查询可以表示出任意复杂的查询结果,这种能力远远超过Excel透视表本身
- DAX Studio是编写DAX查询的强大武器
- DAX Studio除了编写DAX查询外,还具备其他更多特性
- 理解如何借助DAX Studio完成DAX查询与Excel的连接
- 理解如何直接在原生Excel中实现DAX查询
- 理解如何在Power BI Desktop中进行DAX查询
- 理解如何借助DAX Studio测试DAX查询(返回表或返回值)
本文将详细说明畅快驾驶DAX Studio的方法。
现在打开你的DAX Studio以及示例文件Contoso.pbix(你可以使用自己的测试文件)。如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-07-50.jpg)
DAX查询编写
DAX查询的语法为:
根据 微软官方DAX查询参考 可知:
DAX 语言提供了一种新语法,可从查询中返回表数据。
通过 DAX 查询,用户可从内存分析引擎 (VertiPaq) 来检索由表表达式定义的数据。 用户可将度量值作为查询的一部分创建;查询结束后,这些结果会被释放,除非导出这些结果。
DAX 查询 的语法如下:
[DEFINE { MEASURE <tableName>[<name>] = <expression> }
EVALUATE <table>
[ORDER BY {<expression> [{ASC | DESC}]}[, …]
[START AT {<value>|<parameter>} [, …]]]
具体参考微软官方文档,不做过多说明。
其中,EVALUATE是重点。包含用于生成查询结果的表表达式。 表达式可以使用任何定义的度量值。表达式必须返回表。 如果需要标量值,则度量值的作者可以将其标量包装在 ROW() 函数内,以便生成包含所需标量的表。
在DAX中,常见的返回表的情况包括:
- 直接返回表本身,如:
EVALUATE Product
- 返回被过滤的表,如:
EVALUATE
FILTER ( 'Product', 'Product'[Color] = "red" )
- 返回CACULATETABLE计算后的表,如:
EVALUATE
CALCULATETABLE (
DISTINCT ( 'Product'[Product Name] ),
'Product Category'[Category] = "audio"
)
- ALL和VALUES也是返回表的函数,在DAX Studio中可以很好的看到它们的特性,如:
EVALUATE
ALL('Product Category'[Category])
EVALUATE
VALUES('Product Category'[Category])
结果如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-28-48.jpg)
注意:DAX Studio 2.6 开始支持返回多结果,也就是一次性写多个EVALUATE进行计算。
另外一个结果是:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-30-55.jpg)
发现了吗?ALL和VALUES在这种情况下返回的结果是一样的。你还可以自行实验有 重复值 列的情况。
流畅的代码编写体验
之所以说当你熟悉了DAX的感觉后会不能再没有她,正是因为她能帮助你流畅地编写DAX代码。这表现在:
- DAX 函数及模型元数据智能感知,如:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-37-07.jpg)
DAX Studio 可以自动识别当前DAX引擎可用的DAX函数以及当前模型的元数据(表及列)并迅速进行提示,这使得编写代码的速度很快。
- DAX 代码着色及格式化
DAX Studio 使用DAXFormatter.com对代码进行格式化,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-42-19.jpg)
点击:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-42-37.jpg)
得到:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-43-02.jpg)
在编写复杂的 DAX 查询 时,代码着色以及括号匹配能帮助我们避免很多错误。
- 语法检测及错误提醒
如果你的代码出现错误,DAX Studio可以进行语法检查并帮助排除错误。例如在上述的DAX查询中,对[Category Code]
不小写多写了一个空格成为[Category Code ]
,这也是不允许的,DAX Studio会报错,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-47-23.jpg)
DAX Studio 帮助锁定了出错的位置是第4行第17列,并提示了错误信息“找不到列Category Code 或该列不能用于此表达式”。
DAX 查询编写最佳实践
基于DAX查询具有的特点:DAX查询是嵌套进行的。可以逐层地来构造查询,以确保在每一步都可以进行调试。
注意利用 DAX Studio 2.6 版本以后可返回多结果的功能。
例如:构建一个返回分类及子分类下销售额汇总的表。这个在DAX Studio中逐步编写代码的过程大致如下:
DEFINE
//定义度量值计算销售额
MEASURE Sales[Total Sales] =
SUMX ( Sales, Sales[Net Price] * Sales[Quantity] )
EVALUATE
//总销售额
ROW ( "values", [Total Sales] )
EVALUATE
//生成类别层级表
SELECTCOLUMNS (
GENERATE ( 'Product Category', RELATEDTABLE ( 'Product Subcategory' ) ),
"Category", 'Product Category'[Category],
"Sub Category", 'Product Subcategory'[Subcategory]
)
EVALUATE
//为类别层级表添加销量
ADDCOLUMNS (
SELECTCOLUMNS (
GENERATE ( 'Product Category', RELATEDTABLE ( 'Product Subcategory' ) ),
"Category", 'Product Category'[Category],
"Sub Category", 'Product Subcategory'[Subcategory]
),
"Total Sales", [Total Sales]
)
可以看出在上述过程中,并没有删除每一步的代码,而总是利用每一次的代码继续下一步。并得到结果:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-15-26.jpg)
可以发现,有的类别层级组合是没有销售额的,不希望显示这样的结果,于是可以进一步用FILTER来进行过滤,甚至进一步格式化输出结果,如下:
EVALUATE
//为类别层级表添加销量并过滤空行
//格式化输出结果
FILTER (
ADDCOLUMNS (
SELECTCOLUMNS (
GENERATE ( 'Product Category', RELATEDTABLE ( 'Product Subcategory' ) ),
"Category", 'Product Category'[Category],
"Sub Category", 'Product Subcategory'[Subcategory]
),
"Total Sales", FORMAT( [Total Sales] / 10000 , "0.0W" )
),
ISBLANK ( [Total Sales] ) = FALSE () && [Total Sales] <> ""
)
结果为:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-20-59.jpg)
这已经很完美。
尤其是在编写复杂的 DAX 查询 时,可以采用逐步测试的方法并配合注释使得DAX代码可以被长期维护。
使用DAX Studio理解模型中的元数据
DAX Studio可以帮助分析师了解模型的元数据,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-24-25.jpg)
包括Power BI Desktop自动生成的代码,例如:Power BI Desktop会自动为每个日期列添加一个适用于时间智能的隐藏日期表。这个隐藏的日期表在Power BI Desktop默认是看不到的,但是在DAX Studio中却一览无遗。
如果禁用Power BI Desktop自动生成日期表的功能,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-27-50.png)
此时回到DAX Studio中查看模型的元数据将不再存在隐藏的日期表,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-28-51.jpg)
使用DAX Studio理解所有DAX函数
DAX Studio可以读取DAX引擎支持的所有函数,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-30-07.jpg)
这可以帮助分析师快速了解所有的DAX函数,包括DAX引擎更新后可能新加入的函数。
使用DAX Studio初步理解DMV并使用Power BI Desktop作为分析服务
Analysis Services Dynamic Management Views (DMV),即:分析服务的动态管理视图,它提供了对当前运行的分析服务动态信息进行查询的接口。如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-39-29.jpg)
由于Excel Power Pivot,Power BI Desktop以及SSAS均使用分析服务引擎,所以都具备这个DMV。通过查询DMV,用户可以知道由于当前分析服务的几乎所有信息,这为基于Power BI Desktop的高级应用提供了基础。
例如:DMV透露了作为当前分析服务的实例,那便可以使用该实例作为服务器。将Excel作为客户端,与之进行连接。
这里显示了端口号:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-49-55.jpg)
用Excel作为客户端工具与之连接,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-54-36.jpg)
输入刚刚在DAX Studio中得到的连接信息,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-55-43.jpg)
Excel提示可以与当前的分析服务连接,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-57-13.jpg)
此时,在Power BI Desktop定义的模型便可以直接在Excel中使用了,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-59-22.jpg)
至此,Excel与Power BI Desktop完全连接起来,不需要在Excel中建立数据模型一样可以直接对数据模型加以利用。
有关DMV的深度利用,超出了本文范围,后续再做描述。
使用DAX Studio输出DAX查询
这又是一项DAX Studio非常出彩的功能。我们知道在Excel中单表限制是100W行数据;而在Power BI Desktop中又无法导出数据。这就存在一个问题,那就是:是否可能将加载进数据模型(Excel 数据模型或Power BI Desktop数据模型)的大数据量级事实表(如:超过1000W行)导出?
对于分析师而言,这是一个非常重要的功能。这项功能也是由DAX Studio提供的。
在示例PBI文件中便使用了多达1200W行的销售数据,如下:
EVALUATE
ROW ( "rows of sales", COUNTROWS ( Sales ) )
结果:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-08-21.jpg)
这甚至不能只能在DAX Studio的输出视图中显示,这有可能导致内存不足。但可以通过DAX Studio把输出目标改为文件,这样就像在内存数据模型与硬盘目标文件之间建立了管道,数据像流水一样,顺畅地流入目标文件。
在DAX Studio设置输出目标为:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-11-22.jpg)
执行这项“危险”的操作如下:
EVALUATE
Sales
执行查询,并设置保存的文件格式为CSV格式:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-14-36.jpg)
DAX Studio大致以每秒15000行的速度导出数据:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-15-35.jpg)
如果此时观察任务管理器,可以看到:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-16-51.jpg)
DAX Studio进程以全速工作,并以1.5~2M/S每秒的速度与磁盘交互,在它身边正是Power BI Desktop启动的本地分析服务。
导出结果如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-40-14.jpg)
文件大小为2G。Power BI Desktop源文件(包含Sales在内所有模型表)整个大小为300M。DAX引擎的压缩能力在此也可见一斑。
分析师电脑配置在硬盘方面使用固态硬盘便是为此处考虑。增加硬盘的读写速度,对于大数据量级数据读写有明显优势。
总结
至此,现在我们已经可以基本驾驶DAX Studio完成大多数DAX查询相关工作,包括:
- 流畅地编写DAX查询。
- 使用DAX Studio实现逐步编写DAX查询。
- 使用DAX Studio学习理解所有DAX函数。
- 使用DAX Studio理解模型的元数据。
- 初步使用DAX Studio理解DMV。
- 使用DAX Studio导出DAX查询。
如果说现在已经可以通过DAX Studio畅快地驾驶DAX查询,那还有最后一个阶段,那就是:透彻地理解DAX引擎,完成修车,弯道急速超车等高难度动作。
推荐<<极品飞车>>这一电影,其中一个片段是:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-33-04.jpg)
有好车,不一定人人能开出极速。所有的分析师都可以使用Power BI Desktop,但真正的高手是能开出极速的。
其中还有一个片段:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-36-10.jpg)
梦想,比工作更重要。
这两个片段,你找到了吗?
对于如何像电影的感觉一般与DAX查询为伍将在第三篇章中继续探索。
如果你对本文感兴趣,欢迎分享到你的朋友圈。
后台留言便可获取示例文件。
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-31-12.jpg)