PowerBI矩阵中按行计算产品累计去重计数的DAX度量实现咨询
PowerBI矩阵中按行计算产品累计去重计数的DAX度量实现咨询
嘿,我完全get到你的需求了——你要做一个矩阵可视化,行是年份(Y轴),列是各统计期间,每个单元格得显示到当前期间为止,当年累计的去重产品数量对吧?先把你的源数据整理成清晰的表格方便参考:
| Year | Period | Product |
|---|---|---|
| 2020 | 1 | A |
| 2020 | 2 | C |
| 2020 | 3 | A |
| 2020 | 3 | B |
| 2020 | 4 | C |
| 2021 | 2 | B |
| 2021 | 3 | C |
| 2021 | 4 | D |
| 2021 | 1 | A |
| 2021 | 1 | C |
| 2022 | 3 | A |
| 2022 | 4 | C |
| 2022 | 1 | C |
| 2022 | 2 | D |
| 2022 | 1 | A |
| 2023 | 4 | C |
| 2023 | 3 | B |
| 2023 | 2 | C |
| 2023 | 4 | B |
| 2023 | 1 | A |
| 2024 | 1 | A |
| 2024 | 4 | B |
| 2024 | 3 | C |
你用快速度量生成的DAX有两个小问题,会导致结果不符合预期:一是它会跨年份累计(比如2020年的期间4会把其他年份的产品也算进去),二是它用了ISONORAFTER(..., DESC),这是从当前期间往后累计(比如期间3会算3、4的产品),而你要的是从期间1到当前期间的正向累计。
给你调整后的DAX,完全贴合你的需求:
累计去重产品数(按期间)= CALCULATE( DISTINCTCOUNT('Sheet1'[Product]), -- 筛选当前年份内,所有小于等于当前单元格期间的记录 FILTER( ALLSELECTED('Sheet1'[Period]), 'Sheet1'[Period] <= MAX('Sheet1'[Period]) ), -- 保留当前行的Year上下文,确保累计只在同一年份内进行 ALLEXCEPT('Sheet1', 'Sheet1'[Year]) )
逻辑解释:
- DISTINCTCOUNT('Sheet1'[Product]):核心是统计去重后的产品数量,和你原度量的目标一致
- FILTER(ALLSELECTED('Sheet1'[Period]), ...):筛选所有被选中的期间中,小于等于当前单元格期间的那些,实现“累计到当前期间”的效果
- ALLEXCEPT('Sheet1', 'Sheet1'[Year]):关键!它会清除除了Year之外的所有筛选上下文,确保累计计算只局限在当前矩阵行对应的年份里,不会跨年份串数据
使用的时候,只需要把Year拖到矩阵的行区域,Period拖到列区域,然后把这个新度量拖到值区域,就能得到你想要的效果:每一行对应年份,每一列对应期间,单元格里是当年从期间1到当前期间的累计去重产品总数。
备注:内容来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

