Power BI多条件场景下Units与Revenue求和计算求助
Power BI 分类求和解决方案
核心思路
先按ID维度判断所属分类,再基于分类分别计算Units(取ID唯一值求和)和Revenue(ID下所有行金额总和)。
步骤1:创建ID分类表
先生成一个中间表,给每个ID标记对应的分类,后续聚合更清晰。将代码中的'你的表名'替换为实际表名:
ID Category = SUMMARIZE( '你的表名', '你的表名'[D], "Category", VAR HasA = CALCULATE(COUNTROWS('你的表名'), '你的表名'[Code] = "a") > 0 VAR HasB = CALCULATE(COUNTROWS('你的表名'), '你的表名'[Code] = "b") > 0 VAR HasC = CALCULATE(COUNTROWS('你的表名'), '你的表名'[Code] = "c") > 0 VAR HasD = CALCULATE(COUNTROWS('你的表名'), '你的表名'[Code] = "d") > 0 -- 判断是否存在规则要求的"其他任意Code" VAR OtherCodesExist = CALCULATE(DISTINCTCOUNT('你的表名'[Code])) > IF(HasA,1, IF(HasB && (HasC || HasD),2,1)) RETURN SWITCH( TRUE(), HasA && OtherCodesExist, "Category1", HasB && (HasC || HasD) && NOT(HasA) && OtherCodesExist, "Category2", HasB && NOT(HasA) && NOT(HasC) && NOT(HasD) && OtherCodesExist, "Category3", BLANK() ) )
步骤2:计算分类Units总和
Units取每个ID的唯一值求和,用MAX提取ID对应的唯一Units值:
Total Units by Category = SUMX( 'ID Category', CALCULATE(MAX('你的表名'[Units]), '你的表名'[D] = 'ID Category'[D]) )
步骤3:计算分类Revenue总和
Revenue统计每个ID下所有行的金额总和,再按分类汇总:
Total Revenue by Category = SUMX( 'ID Category', CALCULATE(SUM('你的表名'[Revenue]), '你的表名'[D] = 'ID Category'[D]) )
示例数据验证结果
根据你提供的数据,最终汇总结果如下:
| 分类 | 总Units | 总Revenue |
|---|---|---|
| Category1 | 2 | 2890 |
| Category2 | 3 | 2273 |
| Category3 | 5 | 245 |
替代方案:直接创建度量值(无需中间表)
如果不想生成中间表,可直接写包含分类判断的度量值:
Units度量值
Total Units by Category = VAR IDList = VALUES('你的表名'[D]) RETURN SUMX( IDList, VAR CurrentID = [D] VAR HasA = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "a") > 0 VAR HasB = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "b") > 0 VAR HasC = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "c") > 0 VAR HasD = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "d") > 0 VAR OtherCodesExist = CALCULATE(DISTINCTCOUNT('你的表名'[Code]), '你的表名'[D] = CurrentID) > IF(HasA,1,IF(HasB && (HasC || HasD),2,1)) VAR IsValid = SWITCH( TRUE(), HasA && OtherCodesExist, TRUE, HasB && (HasC || HasD) && NOT(HasA) && OtherCodesExist, TRUE, HasB && NOT(HasA) && NOT(HasC) && NOT(HasD) && OtherCodesExist, TRUE, FALSE ) RETURN IF(IsValid, CALCULATE(MAX('你的表名'[Units]), '你的表名'[D] = CurrentID), 0) )
Revenue度量值
Total Revenue by Category = VAR IDList = VALUES('你的表名'[D]) RETURN SUMX( IDList, VAR CurrentID = [D] VAR HasA = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "a") > 0 VAR HasB = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "b") > 0 VAR HasC = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "c") > 0 VAR HasD = CALCULATE(COUNTROWS('你的表名'), '你的表名'[D] = CurrentID, '你的表名'[Code] = "d") > 0 VAR OtherCodesExist = CALCULATE(DISTINCTCOUNT('你的表名'[Code]), '你的表名'[D] = CurrentID) > IF(HasA,1,IF(HasB && (HasC || HasD),2,1)) VAR IsValid = SWITCH( TRUE(), HasA && OtherCodesExist, TRUE, HasB && (HasC || HasD) && NOT(HasA) && OtherCodesExist, TRUE, HasB && NOT(HasA) && NOT(HasC) && NOT(HasD) && OtherCodesExist, TRUE, FALSE ) RETURN IF(IsValid, CALCULATE(SUM('你的表名'[Revenue]), '你的表名'[D] = CurrentID), 0) )
内容的提问来源于stack exchange,提问作者Sea Breeze
相关产品推荐
相关产品推荐

