Excel 2016 Power Pivot:跨多事实表计算员工姓名唯一计数
嘿,我来帮你搞定这个Power Pivot里的唯一员工计数需求,其实步骤很清晰,核心是用好DAX函数和表间关系,具体操作如下:
第一步:先确认表间关系配置正确
这是基础,不然后续DAX计算会出问题:
- 打开Power Pivot窗口,切换到关系图视图
- 分别把
Forecast、Actual、Invoice三个事实表中的Employee Name字段,拖到维度表Roster的Employee Names字段上,建立一对多的关系(Roster是“一”端,事实表是“多”端) - 确保这些关系都是活跃状态(默认就是活跃的,除非你手动修改过)
第二步:创建DAX度量值
根据你的需求,分两种场景来写度量:
场景1:分别统计单个事实表的唯一员工数
如果需要单独看每个事实表里,当前维度(比如Project/Company)筛选下的唯一员工数量,创建这三个度量:
Forecast 唯一员工数 = DISTINCTCOUNT(Forecast[Employee Name])
Actual 唯一员工数 = DISTINCTCOUNT(Actual[Employee Name])
Invoice 唯一员工数 = DISTINCTCOUNT(Invoice[Employee Name])
小提示:如果担心事实表里有不在
Roster中的无效员工名,可以用CALCULATE(DISTINCTCOUNT(Forecast[Employee Name]), RELATEDTABLE(Roster)),这样只会统计维度表里存在的员工。
场景2:统计三个表合并后的去重员工数
如果需要统计至少出现在任意一个事实表中的唯一员工总数(同一个员工在多个表出现只算一次),用这个度量:
总唯一员工数 = VAR 预测员工 = VALUES(Forecast[Employee Name]) VAR 实际员工 = VALUES(Actual[Employee Name]) VAR 发票员工 = VALUES(Invoice[Employee Name]) VAR 所有员工 = UNION(预测员工, 实际员工, 发票员工) RETURN COUNTROWS(所有员工)
如果要严格限定只统计Roster里的员工(过滤掉事实表的脏数据),可以用这个版本:
总唯一员工数(仅Roster内) = CALCULATE( COUNTROWS(Roster), FILTER( Roster, EXISTS(Forecast, Forecast[Employee Name] = Roster[Employee Names]) || EXISTS(Actual, Actual[Employee Name] = Roster[Employee Names]) || EXISTS(Invoice, Invoice[Employee Name] = Roster[Employee Names]) ) )
第三步:在数据透视表中应用
- 回到Excel界面,插入新的数据透视表,选择使用此工作簿的数据模型作为数据源
- 把你需要的维度字段(比如
Project或Company)拖到透视表的行/列区域 - 最后把刚才创建的度量值拖到值区域,就能看到每个维度分组下的唯一员工计数了
额外注意点
- 先检查事实表的
Employee Name有没有拼写不一致的情况(比如大小写、多余空格),建议用Power Query提前清洗数据,否则DISTINCTCOUNT会把它们当成不同的员工 - 如果维度字段(比如
Project)不在事实表中,而是在其他维度表里,记得也要建立对应的表间关系,确保筛选能正确传递
内容的提问来源于stack exchange,提问作者Brian




