Power BI编写DAX度量值正确统计各国分类型奥运奖牌数
问题说明
- 已导入奥运会赛事CSV数据集,字段包含国家、运动员姓名、举办年份、运动大项、赛事小项、奖牌类型、奥运举办城市
- 核心统计规则:制作各国各类型奖牌数量柱状图时,排球、足球等团队项目奖牌仅计1枚,不按队内运动员人数重复累加
- 最初尝试通过去重Event列、删除运动员列新建计算表的方案可行,但不想额外配置表间关系,因此选择DAX度量值实现方案
- 最初编写的度量值可正确返回截至2012年奥运历史总奖牌数14753,但筛选上下文完全失效:任意国家、任意奖牌类型筛选下均返回总计数14753,无法匹配当前筛选维度统计对应结果
原度量值失效原因
原公式Medal count = COUNTX(CALCULATETABLE(ALLEXCEPT('summer (3)','summer (3)'[Athlete]),DISTINCT('summer (3)'[Event])),'summer (3)'[Medal])的核心错误是ALLEXCEPT函数使用逻辑颠倒:ALLEXCEPT('表名','保留筛选的列')的作用是移除表中除指定列外所有列的筛选上下文,原公式仅保留了[Athlete]列的筛选,直接清空了国家、奖牌类型、年份等所有需要参与筛选的维度的筛选条件,因此无论外部筛选器选什么值,计算范围始终是全量数据集。
修正后的度量值
统计逻辑:在当前筛选上下文范围内,对唯一奖牌事件去重计数——同一团队项目的所有运动员记录,在「年份+举办城市+运动大项+赛事小项+国家+奖牌类型」维度上的值完全一致,去重后仅计数1次,同时完整保留所有外部筛选的生效能力。
Medal count = COUNTROWS( DISTINCT( SELECTCOLUMNS( -- 先过滤掉未获得奖牌的空记录,避免无效计数 FILTER('summer (3)', NOT(ISBLANK('summer (3)'[Medal]))), "Event_Key", 'summer (3)'[Year] & "|" & 'summer (3)'[City] & "|" & 'summer (3)'[Sport] & "|" & 'summer (3)'[Event] & "|" & 'summer (3)'[国家] & "|" & -- 此处替换为你数据集里实际的国家字段名 'summer (3)'[Medal] ) ) )
使用说明
- 若数据集内已有每个奖牌事件对应的唯一ID字段,可直接简化为
Medal count = DISTINCTCOUNT('summer (3)'[唯一事件ID]),无需拼接多列生成唯一键 - 该度量值自动继承所有筛选上下文:按国家筛选、按奖牌类型筛选、按年份筛选均会正常生效,无需额外配置
- 无需新建计算表,不存在额外表间关系配置成本,直接将度量值放入柱状图的值字段,X轴拖入国家字段、图例拖入奖牌类型字段即可生成正确图表
内容的提问来源于stack exchange,提问作者lipao255
相关产品推荐
相关产品推荐

