Power BI动态项目周排名矩阵实现问题求助
问题:Power BI复刻Excel每周项目排名矩阵的动态排名与单元格拆分问题
需求说明
要在Power BI中复刻Excel风格的每周项目排名矩阵,具体要求:
- 按日历周的项目金额进行排名
- 矩阵单元格显示金额、项目名、区域、日期
- 行维度为排名,列维度为包含周起止、周数的时间线
- 支持区域、项目经理(PM)等切片器动态过滤
已完成操作
- 创建周排名计算列,DAX代码如下:
Ranking = VAR cdate = Table1[Date] VAR cweek = WEEKNUM(cdate, 21) VAR cyear = Table1[Year] VAR camount = Table1[Actual_Amt] RETURN IF ( NOT ISBLANK(cdate), RANKX( FILTER( ALLSELECTED(Table1),WEEKNUM(Table1[Date], 21) = cweek && YEAR(Table1[Date]) = cyear ), Table1[Actual_Amt] + (1 - 1 / DATEVALUE(Table1[Date])), , DESC, DENSE),BLANK() )
- 创建矩阵值格式化度量值:
ProjectInfoFormatted = VAR LineBreak = UNICHAR(10) VAR EuroAmt = FORMAT(SUM(Table1[EuroAmount]), "#,##0") VAR Project = SELECTEDVALUE(Table1[ProjectName]) VAR Region = SELECTEDVALUE(Table1[Region]) VAR IssueDate = FORMAT(SELECTEDVALUE(Table1[Date]), "dd/MM/yyyy") RETURN EuroAmt & LineBreak & Project & LineBreak & Region & LineBreak & IssueDate & LineBreak
- 创建包含1-50的独立排名表,并与主表建立多对一关系
遇到的问题
- 切片器(区域/PM)过滤时排名无法正确更新,出现0行、重复或缺失排名的情况
- 同周同金额的项目被合并到同一矩阵单元格,需每个项目单独占一行(即使排名相同)
解决方案
1. 修复切片器响应的动态排名问题
计算列无法响应切片器的动态过滤,必须改用度量值计算排名,确保排名随上下文实时更新:
DynamicWeeklyRank = VAR CurrentWeek = WEEKNUM(MAX(Table1[Date]), 21) VAR CurrentYear = YEAR(MAX(Table1[Date])) VAR CurrentProject = MAX(Table1[ProjectName]) RETURN IF( NOT ISBLANK(MAX(Table1[Date])), RANKX( FILTER( ALLSELECTED(Table1), WEEKNUM(Table1[Date], 21) = CurrentWeek && YEAR(Table1[Date]) = CurrentYear ), // 拼接金额与项目名作为唯一标识,保证同金额项目排名一致但不合并 Table1[Actual_Amt] & "|" & Table1[ProjectName], , DESC, DENSE ), BLANK() )
2. 确保同金额项目单独占一行
- 矩阵行维度设置:将主表的ProjectName添加到行维度的最内层(在排名字段下方),即使排名相同,不同项目会自动拆分为单独行。
- 关闭矩阵合并单元格:在矩阵「格式」选项卡中,关闭「合并单元格」功能,确保每个项目信息独立显示。
- 修正格式化度量值:替换
SELECTEDVALUE为MAX,避免多项目时返回空值:
ProjectInfoFormatted = VAR LineBreak = UNICHAR(10) VAR EuroAmt = FORMAT(MAX(Table1[EuroAmount]), "#,##0") VAR Project = MAX(Table1[ProjectName]) VAR Region = MAX(Table1[Region]) VAR IssueDate = FORMAT(MAX(Table1[Date]), "dd/MM/yyyy") RETURN EuroAmt & LineBreak & Project & LineBreak & Region & LineBreak & IssueDate
3. 优化独立排名表的显示
- 将独立排名表与主表的关系设置为「不活跃」,使用以下度量值匹配排名,确保1-50的排名行全部显示:
RankRowDisplay = VAR SelectedRank = MAX('RankTable'[Rank]) VAR CurrentWeek = WEEKNUM(MAX(Table1[Date]),21) VAR CurrentYear = YEAR(MAX(Table1[Date])) RETURN CALCULATE( COUNTROWS(Table1), FILTER( ALLSELECTED(Table1), WEEKNUM(Table1[Date],21) = CurrentWeek && YEAR(Table1[Date]) = CurrentYear && [DynamicWeeklyRank] = SelectedRank ) )
- 矩阵行维度使用
RankTable[Rank],并在「行选项」中开启「显示无数据的项目」,确保所有排名行都能显示。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

