DAX查询进阶:驾驶DAX Studio

![](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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • DAX除了进行计算外,更可以直接作为一门查询语言,如果说SQL是IT的数据库查询语言,那么DAX就可以认为是分析师...
    PowerBI战友联盟阅读 30,496评论 6 37
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,665评论 0 11
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • 润心读书会每日一诵第64诵:仪封人请见。曰:君子之至于斯也,吾未尝不得见也。从者见之。出曰:二三子的,何患于丧乎?...
    宋允儿阅读 131评论 0 0
  • █ █今天我们要介绍的是《巴黎圣母院》。作者是我们熟悉的法国教科书级小说家雨果。中文版全书共11卷,40多万字。1...
    法的守夜人阅读 842评论 0 1