在DAX studio 中的DAX 查询

转自简书:https://www.jianshu.com/p/4c4b3d551201

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)

猜你喜欢

转载自blog.csdn.net/Babyfatliang/article/details/84727228