DAX基础--FILTER

本文介绍了DAX中的FILTER函数,作为基础且重要的工具,FILTER用于返回筛选后的表。通过示例展示了如何根据条件筛选表格,并讨论了与SQL的关联及RELATED函数的使用。同时,文章揭示了FILTER的执行顺序及其在复杂表达式中的挑战,提醒读者注意避免嵌套使用以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值