如何通过Power BI DAX实现带唯一值计数与占比的交叉透视表
Power BI 实现指定交叉透视表的DAX方案
需求说明
基于包含id、name、date字段的原始数据表,生成行/列均为name的交叉透视表,规则如下:
- 对角线单元格:对应
name的唯一id计数 - 非对角线单元格:同时属于行
name和列name的唯一id数量,占列name总唯一id数的比例(格式如1/2(50%)) - 支持日期切片器的用户筛选
步骤1:创建独立Name维度表
由于交叉透视表的行和列都要使用name字段,为避免上下文筛选冲突,先创建包含唯一name值的维度表:
Name维度表 = DISTINCT('原始表'[name])
关系配置:将
Name维度表与原始表的name字段建立无筛选方向的关系,确保行/列的name筛选互不干扰。
步骤2:编写核心DAX度量值
创建如下度量值,实现需求中的计算逻辑:
交叉透视计算 = VAR 当前行名称 = SELECTEDVALUE('Name维度表'[name]) VAR 当前列名称 = SELECTEDVALUE('Name维度表'[name]) -- 获取当前行名称对应的唯一ID集合(保留日期切片器筛选) VAR 行唯一ID集合 = CALCULATETABLE( DISTINCT('原始表'[id]), '原始表'[name] = 当前行名称, ALLSELECTED('原始表'[date]) ) -- 获取当前列名称对应的唯一ID集合及总数 VAR 列唯一ID集合 = CALCULATETABLE( DISTINCT('原始表'[id]), '原始表'[name] = 当前列名称, ALLSELECTED('原始表'[date]) ) VAR 列ID总数 = COUNTROWS(列唯一ID集合) -- 计算行与列ID集合的交集数量 VAR 交集ID数量 = COUNTROWS(INTERSECT(行唯一ID集合, 列唯一ID集合)) RETURN IF( 当前行名称 = 当前列名称, -- 对角线场景:返回当前名称的唯一ID计数 COUNTROWS(行唯一ID集合), -- 非对角线场景:计算比例并格式化输出 IF( 列ID总数 = 0, BLANK(), 交集ID数量 & "/" & 列ID总数 & "(" & FORMAT(交集ID数量/列ID总数, "0%") & ")" ) )
步骤3:配置交叉透视表
- 将
Name维度表的name字段分别拖入交叉透视表的行和列区域 - 将
交叉透视计算度量值拖入交叉透视表的值区域 - 添加日期切片器,选择
原始表的date字段,即可实现日期筛选功能
内容的提问来源于stack exchange,提问作者user1702932
相关产品推荐
相关产品推荐

