Power BI DAX多关系过滤:如何基于双关联计算通话分钟余额?
解决方案:通过DAX度量值解决多对多关联下的筛选与余额计算问题
核心思路
由于月度记录表与每日记录表仅保留monthly records idx的活跃关系,导致账号筛选无法同步到月度表,因此需要在DAX度量值中手动指定账号与年月的双重筛选条件,分别计算当月购买分钟数和累计消耗分钟数,最终得到余额。
前提假设
数据模型需满足:
- 用户账号表包含唯一
AccountID - 月度记录表包含
AccountID、YearMonth(格式建议为YYYYMM文本或月初日期)、PurchaseMinutes(购买分钟数) - 每日记录表包含
AccountID、Date、UsageMinutes(消耗分钟数),且与月度表通过monthly records idx关联
最终DAX度量值
分钟余额 = VAR 当前账号 = SELECTEDVALUE(用户账号表[AccountID]) VAR 当前年月 = FORMAT(MAX(每日记录表[Date]), "YYYYMM") VAR 当前日期 = MAX(每日记录表[Date]) -- 计算当月购买的总分钟数 VAR 当月购买 = CALCULATE( SUM(月度记录表[PurchaseMinutes]), 月度记录表[AccountID] = 当前账号, 月度记录表[YearMonth] = 当前年月 ) -- 计算截止到当前日期的累计消耗分钟数 VAR 累计消耗 = CALCULATE( SUM(每日记录表[UsageMinutes]), 每日记录表[AccountID] = 当前账号, FORMAT(每日记录表[Date], "YYYYMM") = 当前年月, 每日记录表[Date] <= 当前日期 ) -- 返回余额,空值替换为0避免错误 RETURN COALESCE(当月购买, 0) - COALESCE(累计消耗, 0)
代码解释
- 变量定义:获取当前筛选上下文的账号ID、年月和日期,确保计算范围锁定在目标账号的当月数据内
- 当月购买计算:直接筛选月度表中匹配当前账号和年月的记录,求和购买分钟数
- 累计消耗计算:筛选每日表中匹配当前账号、年月,且日期不晚于当前日期的记录,求和消耗分钟数
- 余额计算:用
COALESCE处理空值(如无购买/消耗记录),避免返回错误值
适配无AccountID的每日记录表
如果每日记录表未直接存储AccountID,仅通过monthly records idx关联月度表,可修改累计消耗部分的代码,通过关联月度表获取账号信息:
累计消耗 = CALCULATE( SUM(每日记录表[UsageMinutes]), -- 通过月度表关联账号ID LOOKUPVALUE(月度记录表[AccountID], 月度记录表[_id], 每日记录表[monthly records idx]) = 当前账号, FORMAT(每日记录表[Date], "YYYYMM") = 当前年月, 每日记录表[Date] <= 当前日期 )
可视化设置
- 选择折线图,X轴绑定每日记录表的
Date字段,Y轴绑定上述分钟余额度量值 - 添加用户账号表的
AccountID作为切片器,选择单个账号时即可看到该账号当月余额的变化趋势(月初充值上升,每日使用下降)
内容的提问来源于stack exchange,提问作者rubhemaju
相关产品推荐
相关产品推荐

