DAX基础–FILTER

31

努力就是旺季,不努力就是淡季


FILTER是DAX中最基础也最重要的函数之一

FILTER ( <Table>, <FilterExpression> )
参数 描述
Table 需要被筛选的表或表表达式
FilterExpression 要为表的每一行计算的布尔表达式

它返回一张表,可以是表中所有列也可以是一列或几列,且只包含筛选的行。

语法很简单,来看一个简单的例子, 筛选颜色为红色的产品,新建计算表如下:

Product Red = FILTER (    'Product',    'Product'[Color] = "Red")

总共99条记录,这里只是筛选的同一张表,那么能不能像SQL里那样通过另一张表里的字段来筛选呢,答案是肯定的,只不过在写DAX时不需要再像写SQL那样指定两张表的关联字段(前提是表之间已经建立好了关系),比如可以通过Product表来筛选Sales表中红色产品的销售记录

这里用到了一个新的函数RELATED, 这里可以先简单理解为SQL联表查询时指定外部条件时的固定写法。计算表如下:

Sales Red = FILTER (     Sales,     RELATED ( Product[Color] ) = "Red" )

有了上面的表筛选,再进一步其实就可以写一个红色产品的销售额的度量值。

销售额度量如下:

Sales Amount = SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
红色产品销售额度量:
Sales Amount Red = SUMX (    FILTER ( Sales, RELATED ( Product[Color] ) = "Red" ),    Sales[Quantity] * Sales[Unit Price])

放到图表里来看一下效果

FILTER的第一个参数还可以是表表达式,第二个参数的布尔表达式中不仅可以用列来筛选,也可以用度量值

Product Red Sales Amount >1000 = FILTER(    FILTER( 'Product', 'Product'[Color]="Red" ),    [Sales Amount] >1000)

当然,出于易读性和性能考虑,一般情况下是不推荐嵌套使用FILTER的,上面的代码可以写成如下:

Product  Red Sales Amount >1000 = FILTER(    'Product',     'Product'[Color]="Red"  &&    [Sales Amount] >1000)

上面的内容都很简单,那么再来点不一样的,比如下面的统计红色产品数量的计算表:

Product Red Number = FILTER(    ADDCOLUMNS(        VALUES( 'Product'[Color] ),         "@num", COUNTROWS( 'Product' )    ),    'Product'[Color] = "Red")

竟然是2517条记录,我们不是明明加了筛选条件是红色吗?

这里涉及到了FILTER的执行顺序,可以先记住,它是先迭代,后筛选。即它先扫描整张表,然后才执行后面的布尔表达式。所以上面的代码实际上是先执行这段代码:

 
 ADDCOLUMNS(      VALUES( 'Product'[Color] ),       "@num", COUNTROWS( 'Product' )  )

这段代码做的事也很简单,即先列出所有的颜色,然后统计行数。但是因为这张表并没有按颜色进行分组统计,所以即便后面筛选了红色,结果也还是2517

要实现结果是正确地值需要用到另外的函数,后面再讲到这些函数时再具体解释,可以先看结果

Red Number Summarize = FILTER(    SUMMARIZE(        'Product',        'Product'[Color],         "@num", COUNTROWS( 'Product' )    ),    'Product'[Color] = "Red")

更推荐下面写法

Red Number Calculatetable = CALCULATETABLE (    ADDCOLUMNS(        VALUES( 'Product'[Color] ),         "@num", COUNTROWS( 'Product' )    ),    'Product'[Color] = "red")

DAX里每个函数单看语法其实都不难,难的是当这些函数组合起来时,会产生很多上下文的变化,而这通常很难让人理解,一如SQLBI所说,DAX is simple ,  but not easy


本篇文章来源于微信公众号: PowerBI木小桼

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注