如何基于已结账单子集计算全量行不受筛选的指标?
问题:计算不受筛选影响的客户平均付款天数及预期付款日期
数据集
| Customer | invoice number | invoice date | payment date | payment_days | open_flag |
|---|---|---|---|---|---|
| Customer 1 | invoice 1 | 1/1/24 | 10/1/24 | 9 | no |
| Customer 1 | invoice 2 | 1/1/24 | 20/1/24 | 19 | no |
| Customer 1 | invoice 3 | 5/1/24 | 10/1/24 | 5 | no |
| Customer 2 | invoice 4 | 11/1/24 | 13/1/24 | 2 | no |
| Customer 2 | invoice 5 | 11/1/24 | 13/1/24 | 2 | no |
| Customer 3 | invoice 6 | 12/1/24 | 18/1/24 | 6 | no |
| Customer 1 | invoice 7 | 1/2/24 | NA | yes | |
| Customer 2 | invoice 8 | 3/2/24 | NA | yes | |
| Customer 3 | invoice 9 | 4/2/24 | NA | yes |
计算需求
新增两个不受任何筛选条件影响的计算列,预期结果如下:
| calculated customer avg | expected payment date |
|---|---|
| (9 + 19 + 5) / 3 = 11 | 12/1/24 |
| (9 + 19 + 5) / 3 = 11 | 12/1/24 |
| (9 + 19 + 5) / 3 = 11 | 16/1/24 |
| (2 + 2) / 2 = 2 | 13/1/24 |
| (2 + 2) / 2 = 2 | 13/1/24 |
| (6) / 1 = 6 | 18/1/24 |
| (9 + 19 + 5) / 3 = 11 | 12/2/24 |
| (2 + 2) / 2 = 2 | 5/2/24 |
| (6) / 1 = 6 | 10/2/24 |
calculated customer avg:对应客户所有已结账单(open_flag为no)的付款天数平均值(需去除异常值)expected payment date:该账单的invoice date加上上述平均值后的日期
当前问题
- 仅能在已结账单行计算去除异常值后的平均值,无法同步应用到未结账单行
- 无法访问数据加载编辑器,仅能在工作表内操作
- 要求即使筛选掉所有已结账单,计算仍能返回有效值
现有去除异常值的平均值公式
= Avg( IF( [invoice date] <> [payment date] and SQRT(POW([invoice date] - [payment date],2)) <= 200, [invoice date] - [payment date], null()))
解决方案
1. 计算calculated customer avg列
使用ALLEXCEPT函数固定客户维度的已结账单数据,确保筛选时仍保留计算所需的原始数据集:
= CALCULATE( AVERAGE( IF( [invoice date] <> [payment date] && SQRT(POWER([invoice date] - [payment date], 2)) <= 200, [payment_days], BLANK() ) ), ALLEXCEPT('你的表名', '你的表名'[Customer]), '你的表名'[open_flag] = "no" )
ALLEXCEPT('你的表名', '你的表名'[Customer]):仅保留当前客户的筛选上下文,移除其他所有筛选,确保即使筛选已结账单,仍能获取该客户所有已结账单的原始数据- 过滤
open_flag = "no":仅基于已结账单计算平均值 - 替换
'你的表名'为实际数据表名称;若原始表无payment_days列,可替换回[payment date] - [invoice date]
2. 计算expected payment date列
直接用账单日期加上第一步算出的客户平均付款天数,自动继承平均值的不受筛选特性:
= [invoice date] + [calculated customer avg]
关键说明
ALLEXCEPT替代全局ALL:避免忽略所有筛选,仅保留客户维度关联,确保不同客户的平均值独立计算- 空值处理:
BLANK()会被AVERAGE自动忽略,不影响最终平均值结果
内容的提问来源于stack exchange,提问作者kabk
相关产品推荐
相关产品推荐

