DAX需求:带月份切片器的累计完成率计算问题
累计用户完成率DAX公式修正方案
问题说明
需计算所有用户在各月份的累计完成率,但现有DAX公式存在逻辑错误:筛选十月时,公式会将截至十月完成的用户数除以排除十一月完成用户后的总用户数,而非全部用户总数。已建立dim_date表与业务数据表的关联(关联字段:dim_date[Date] ↔ 业务数据表[Completion Date]),dim_date表包含月份编号(1、2、3……)。
业务数据示例
| ID | Completion_status | Completion Date |
|---|---|---|
| 1 | 0 | |
| 2 | 0 | |
| 3 | 0 | |
| 4 | 0 | |
| 5 | 0 | |
| 6 | 1 | 11/1/2022 |
| 7 | 1 | 11/1/2022 |
| 8 | 1 | 11/1/2022 |
| 9 | 1 | 11/2/2022 |
| 10 | 1 | 11/1/2022 |
| 11 | 1 | 11/6/2022 |
| 12 | 1 | 11/4/2022 |
| 13 | 1 | 11/2/2022 |
| 14 | 1 | 10/13/2022 |
| 15 | 1 | 10/14/2022 |
| 16 | 1 | 10/14/2022 |
| 17 | 1 | 10/13/2022 |
| 18 | 1 | 10/15/2022 |
| 19 | 1 | 10/13/2022 |
| 20 | 1 | 10/13/2022 |
| 21 | 1 | 10/13/2022 |
| 22 | 1 | 10/13/2022 |
| 23 | 1 | 10/18/2022 |
| 24 | 1 | 10/13/2022 |
| 25 | 1 | 10/13/2022 |
| 26 | 1 | 10/13/2022 |
| 27 | 1 | 10/13/2022 |
| 28 | 1 | 9/10/2022 |
| 29 | 1 | 9/8/2022 |
当前错误DAX公式
Completion% = VAR comp rate = SUM(Table[completion_status]) / count(Table[ID]) Return CALCULATE(Table[Completion%],filter(ALL(Dim_Date),Dim_Date[Month Number] <= MAX(Dim_Date[Month Number])))
期望结果
- 筛选九月时:2/29 ≈7%
- 筛选十月时:16/29≈55%
- 筛选十一月时:24/29≈83%
修正后的DAX公式
累计完成率 = VAR 总用户数 = CALCULATE(COUNT('业务数据表'[ID]), ALL('业务数据表')) VAR 当前累计完成数 = CALCULATE( SUM('业务数据表'[Completion_status]), FILTER( ALL('dim_date'), 'dim_date'[Month Number] <= MAX('dim_date'[Month Number]) ) ) RETURN DIVIDE(当前累计完成数, 总用户数, 0)
公式说明
- 总用户数:通过
ALL('业务数据表')清除所有筛选条件,确保获取全部用户的总数(示例中为29),避免日期筛选影响分母数值。 - 当前累计完成数:利用
FILTER(ALL('dim_date'), ...)筛选出截至当前选中月份及之前的所有完成记录,累计求和得到完成用户数。 - DIVIDE函数:安全处理除法运算,当分母为0时返回0,避免出现计算错误。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

