Power BI中DAX互补筛选问题:按月份区分已缴/未缴房租租户
按指定月份区分已付款/未付款租户的DAX解决方案
业务场景与问题
管理楼宇租户付款事宜,租户详情存储于Customer_tb表,每笔付款记录在Sales_tb表中。需在Power BI中实现两个可视化组件:
- 展示选定年月已完成付款的租户表格
- 展示同期未付款的租户表格
应用特定月份筛选(如2025年1月)时,两个可视化无法呈现互补分组:已付款租户(如Joe、Aster)可正常显示,但未付款租户(如Kenny、Eric)在相同筛选条件下无法正常展示。原使用的DAX代码如下:
TenantsWithoutPayments = CALCULATETABLE ( VALUES ( Customer_tb[aptID] ), NOT ( CALCULATE ( COUNTROWS ( Sales_tb ), Sales_tb = Customer_tb[aptID] ) ) )
原代码问题分析
- 关联逻辑错误:
Sales_tb = Customer_tb[aptID]是将整张表与单个租户ID值做比较,逻辑无效,应改为通过Sales_tb[aptID] = Customer_tb[aptID]关联租户付款记录。 - 上下文筛选丢失:未处理日期筛选的上下文,未付款租户因在
Sales_tb中无对应月份记录,会被默认筛选逻辑排除,无法出现在结果中。
正确DAX实现方案
1. 已付款租户计算表
PaidTenants = CALCULATETABLE ( VALUES ( Customer_tb[aptID] ), EXISTS ( Sales_tb, Sales_tb[aptID] = Customer_tb[aptID] && YEAR(Sales_tb[PaymentDate]) = SELECTEDVALUE('Date'[Year]) && MONTH(Sales_tb[PaymentDate]) = SELECTEDVALUE('Date'[Month]) ) )
2. 未付款租户计算表
UnpaidTenants = CALCULATETABLE ( VALUES ( Customer_tb[aptID] ), NOT EXISTS ( Sales_tb, Sales_tb[aptID] = Customer_tb[aptID] && YEAR(Sales_tb[PaymentDate]) = SELECTEDVALUE('Date'[Year]) && MONTH(Sales_tb[PaymentDate]) = SELECTEDVALUE('Date'[Month]) ) )
优化建议(使用日期维度表)
若已建立独立的日期维度表Date,并与Sales_tb[PaymentDate]建立关联,可简化代码并提升筛选准确性:
// 已付款租户 PaidTenants = CALCULATETABLE ( VALUES ( Customer_tb[aptID] ), RELATEDTABLE(Sales_tb) ) // 未付款租户 UnpaidTenants = CALCULATETABLE ( VALUES ( Customer_tb[aptID] ), CROSSFILTER(Sales_tb[PaymentDate], 'Date'[Date], None), NOT EXISTS ( CALCULATETABLE( Sales_tb, Sales_tb[aptID] = Customer_tb[aptID], ALL('Date'), 'Date'[Year] = SELECTEDVALUE('Date'[Year]), 'Date'[Month] = SELECTEDVALUE('Date'[Month]) ) ) )
使用说明
- 创建上述两个计算表后,分别在两个可视化表格中绑定对应表的
aptID及租户信息字段。 - 添加日期切片器(基于
Date表或Sales_tb[PaymentDate]),选择目标年月后,两个表格将自动展示互补的已付款/未付款租户分组。
内容的提问来源于stack exchange,提问作者Eliram Liroy Lugassi
相关产品推荐
相关产品推荐

