在做DAX查询时必须先声明EVALUATE关键字,但除此之外,还有其它可选的查询关键字,比如:ORDER BY、START AT、DEFINE等等。不同的查询关键字有不同的作用,灵活运用各种查询关键字能够更好的控制DAX查询返回的结果。本篇文章将介绍这些查询关键字的用法。
EVALUATE关键字
在DAX查询中,EVALUATE关键字是必须添加的,至少需要一个EVALUATE关键字。在EVALUATE关键字后紧跟着就是返回表的表达式,并且在一个DAX查询中可以包含多个EVALUATE语句,每个语句对应一个输出的结果表。其语法如下:
EVALUATE
<table expression>
下面是EVALUATE关键字的示例用法,可以输出指定的返回表的表达式的结果:
当DAX查询中含有多个EVALUATE关键字时,将会输出多个结果,如下图所示:
以上就是EVALUATE关键字的用法,使用时需要记住它只能输出返回表的表达式,而不能输出标量值。如果需要输出标量值,那么可以使用表构造器语法来将标量值转换成表,如下图所示:
ORDER BY关键字
ORDER BY关键字用在EVALUATE关键字之后,用于对DAX查询返回的表进行排序。其语法如下:
EVALUATE
<table expression>
[ORDER BY {<column name> [{ASC | DESC}]}[, …]]
以下是ORDER BY关键字的示例用法,可以指定按某个列进行排序,如下图所示:
在上面的示例中,将按产品名称进行升序排序。
此外,也可以指定按多个列进行排序,排序的优先级按指定的列顺序依次降低,左边的列优先级更高,即先按左边第一个列进行排序,然后相同项再按第二个列进行排序,以此类推。
在上面对产品名称升序排序的示例中,可以看到订单日期是乱序的,因此可以在按产品名称升序排序后,再按订单日期降序排列,从而更容易观察。如下图所示:
以上就是ORDER BY关键字的用法,比较简单,但使用时需要注意,它只能对查询返回的表具有的列进行排序,并且派生列需要使用非限定性写法进行引用。
START AT关键字
START AT关键字必须用在ORDER BY关键字之后,可以对排序后的查询结果按指定的值作为起始行。其语法如下:
EVALUATE
<table expression>
[ORDER BY {<column name> [{ASC | DESC}]}[, …]
[START AT {<value>|<parameter>} [, …]]]
下面来看下START AT关键字的用法,如下图所示,这是产品表按序号降序后的查询结果:
然后使用STAET AT关键字定义序号5的行为起始行,这将对查询结果进行截取,只返回定义的起始行及之后的数据,如下图所示:
或者先按产品类别与序号进行升序排序,然后再使用START AT关键字指定类别为手机配件且序号为3的行作为起始行,如下图所示:
注意,START AT关键字的第二个参数起作用的前提是ORDER BY第一参数指定的列在查询结果中有重复值,以此类推。
START AT的参数与ORDER BY的参数是一一对应的,因此START AT的参数的数据类型必须与ORDER BY里定义的字段的数据类型一致。另外,START AT的参数数量可以与ORDER BY的参数数量一样多,但不能超过 ORDER BY的参数数量。
DEFINE关键字
DEFINE关键字必须在所有EVALUATE语句之前进行定义,可以定义在后续查询中需要使用到的度量值、计算列、计算表、变量等对象,这些对象只在本次查询期间存在,不会保存在数据模型中,并且对查询中的所有EVALUATE语句都有效。另外,如果查询中使用了DEFINE关键字,那么至少需要定义一个对象,并且查询中只能有一个DEFINE语句。
注意,如果DEFINE语句里定义的度量值名称存在于模型中,那么将会覆盖模型中的同名度量值,但这仅在本次查询内有效,不会改变模型中同名度量值的表达式。
由于DEFINE关键字定义的对象并不会真正保存在数据模型中,因此可以使用DEFINE关键字对度量值等对象的表达式进行调试,等没有问题后,再复制调试好的表达式代码,去模型中创建或修改真正的度量值等对象。
DEFINE关键字的语法如下:
[DEFINE
(
(MEASURE <table name>[<measure name>] = <scalar expression>) |
(VAR <var name> = <table or scalar expression>) |
(TABLE <table name> = <table expression>) |
(COLUMN <table name>[<column name>] = <scalar expression>) |
) +
]
(EVALUATE <table expression>) +
下面是使用DEFINE关键字定义度量值的示例用法:
下面是使用DEFINE关键字定义计算列的示例用法:
下面是使用DEFINE关键字定义计算表的示例用法:
下面是使用DEFINE关键字定义VAR变量的示例用法:
以上就是DEFINE关键字的用法了,在定义计算表和计算列时的红色波浪线可以忽略掉,可能公式编辑器的智能提示存在问题,但这是符合语法的而且也能正常运行。
总结
查询关键字能够帮助我们更好的调整DAX查询的返回结果,而且也能定义一些度量值或计算列等临时对象,从而帮助更好的调试代码,因此DAX查询中各个关键字的用法也是必须要掌握的,尽管这些关键字只是可选的。