DAX基础–FILTER
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 (
RELATED ( Product[Color] ) = "Red"
)
有了上面的表筛选,再进一步其实就可以写一个红色产品的销售额的度量值。
销售额度量如下:
Sales Amount = SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
红色产品销售额度量:
Sales Amount Red =
SUMX (
FILTER ( Sales, RELATED ( Product[Color] ) = "Red" ),
* 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" &&
[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木小桼