Power BI DAX 如何单公式为计算表添加汇总列与占比列
DAX 单公式生成带总计、占比的按月汇总计算表
问题描述
现有一张TestTable计算表,基于Receipts表按Month列做汇总,同时新增列统计每个月份在Receipts表中的出现次数,初始DAX公式如下:
TestTable = SUMMARIZE(Receipts, Receipts[Month], "TotalReceiptsIssuedInThisMonth", SUM(Receipts[Receipts Issued]), "OccurenceOfMonth", COUNT(Receipts[Month]))

需要为TestTable新增两列,实现两个需求:
- 对
TotalReceiptsIssuedInThisMonth列做全表求和,每一行都展示该总计值 - 逐行计算当月收据开具额占总开具额的比例
通过在已生成的计算表上手动新建列可以实现效果,用到的公式如下:
AvgPercentageReceiptsIssuedInThisMonth = TestTable[TotalReceiptsIssuedInThisMonth]/TestTable[TotalReceiptsIssued] TotalReceiptsIssued = SUM(TestTable[TotalReceiptsIssuedInThisMonth])

但需要将两列的计算逻辑直接整合到TestTable的原始定义公式中,一步完成所有计算,以便将其作为变量用于Receipts表的相关逻辑,避免建立关系时触发循环依赖错误。
已尝试的错误写法
- 直接在
SUMMARIZE中追加两列定义:
TestTable = SUMMARIZE(PPTs, PPTs[Month], "TotalReceiptsIssuedInThisMonth", SUM(PPTs[PPTs Issued]), "OccurenceOfMonth", COUNT(PPTs[Month]), "TotalReceiptsIssued", SUM(TestTable[TotalReceiptsIssuedInThisMonth]), "AvgPercentageReceiptsIssuedInThisMonth", TestTable[TotalReceiptsIssuedInThisMonth]/TestTable[TotalReceiptsIssued])
返回报错:无法确定表'TestTable'中列'TotalReceiptsIssuedInThisMonth'的单个值。当度量值公式引用包含多个值的列但未指定min、max、count、sum等聚合来获取单个结果时,可能会出现此问题。
2. 用变量分步计算:
TestTable = VAR first = SUMMARIZE(Receipts, Receipts[Month], "TotalReceiptsIssuedInThisMonth", SUM(Receipts[Receipts Issued]), "OccurenceOfMonth", COUNT(Receipts[Month])) VAR second = SUM(TestTable[TotalReceiptsIssuedInThisMonth]) VAR third = first[TotalReceiptsIssuedInThisMonth]/second RETURN third
返回报错:无法在当前上下文中使用变量'first',因为此处需要基表。
解决方案
两个报错的核心原因:
- 在
TestTable的定义公式内部引用还未完成计算的TestTable自身,属于循环自引用,DAX无法解析未生成对象的列值 - 存储表的变量不能直接通过
表[列]语法访问列值,也不能直接返回单列计算结果作为最终输出的表,DAX要求计算表的最终返回结果必须是表结构对象。
正确写法通过变量分层计算,全程无自引用,单公式输出完整结果:
TestTable = // 生成基础按月汇总表 VAR BaseSummary = SUMMARIZE ( Receipts, Receipts[Month], "TotalReceiptsIssuedInThisMonth", SUM ( Receipts[Receipts Issued] ), "OccurenceOfMonth", COUNT ( Receipts[Month] ) ) // 计算全量总收据开具额(标量值) VAR TotalAllReceipts = SUMX ( BaseSummary, [TotalReceiptsIssuedInThisMonth] ) // 为基础表追加总计列、占比列,返回最终表 RETURN ADDCOLUMNS ( BaseSummary, "TotalReceiptsIssued", TotalAllReceipts, "AvgPercentageReceiptsIssuedInThisMonth", DIVIDE ( [TotalReceiptsIssuedInThisMonth], TotalAllReceipts ) )
写法说明
- 用
SUMX遍历已生成的基础汇总表计算总计,完全避免对未生成TestTable的自引用 - 占比计算使用
DIVIDE函数替代直接除法,自动处理总计为0时的除零错误,返回空值避免异常 - 所有计算在变量阶段完成,最终返回完整表结构,不存在基表引用错误,也不会触发循环依赖,可以直接作为变量嵌套到其他针对
Receipts表的DAX逻辑中使用。
内容的提问来源于stack exchange,提问作者Sweepster
相关产品推荐
相关产品推荐

