Power BI新手技术求助:实现两个基于最新日期的DAX度量值相乘并修正总计错误
解决Power BI中基于最新采购日期的成本总计与乘积问题
嘿,作为经常帮Power BI新手踩坑的过来人,你的这个问题太典型啦!我来给你拆解一下问题根源,再一步步搞定它。
问题出在哪?
你写的两个度量Latest Unit/Cost和Latest UnitsUsed,在矩阵的行级(比如单独看某一个物料)时,MAX(InventoryJ[Date Ordered])是该物料的最新采购日期,所以计算结果是对的。但到了总计行,这个MAX会变成整个数据集里的最新日期,系统会用这个全局最新日期去拉所有物料的数据——这就导致总计不是各行结果的合理聚合,而是错误地用统一日期计算,自然就不对了。
修正单个度量,让总计行正常工作
我们需要让每个物料(或你矩阵里的其他分组维度)单独计算自己的最新日期,而不是用全局日期。修改后的度量如下:
修正后的Latest Unit/Cost
Latest Unit/Cost = SUMX( VALUES(InventoryJ[Material]), // 按物料维度分组计算 VAR MaxDatePerMaterial = CALCULATE(MAX(InventoryJ[Date Ordered]), ALLEXCEPT(InventoryJ, InventoryJ[Material])) RETURN CALCULATE(SUM(InventoryJ[Cost/Unit]), InventoryJ[Date Ordered] = MaxDatePerMaterial) )
修正后的Latest UnitsUsed
Latest UnitsUsed = SUMX( VALUES(InventoryJ[Material]), VAR MaxDatePerMaterial = CALCULATE(MAX(InventoryJ[Date Ordered]), ALLEXCEPT(InventoryJ, InventoryJ[Material])) RETURN CALCULATE(SUM(InventoryJ[Unit Used]), InventoryJ[Date Ordered] = MaxDatePerMaterial) )
这里的关键是SUMX+ALLEXCEPT:
VALUES(InventoryJ[Material])确保我们逐个处理每个物料ALLEXCEPT会保留当前物料的上下文,清除其他筛选,这样计算的MaxDatePerMaterial就是该物料自己的最新采购日期
如果你的矩阵还有其他分组维度(比如部门、类别),只需要把这些维度加到ALLEXCEPT的参数里就行,比如ALLEXCEPT(InventoryJ, InventoryJ[Material], InventoryJ[Department])。
计算最新数量×最新单位成本的正确总计
现在两个单个度量的总计已经正常了,你可以直接相乘得到乘积,但更严谨的方式是用SUMX逐行计算乘积再求和,这样总计就是各行乘积的总和:
Latest Total Cost = SUMX( VALUES(InventoryJ[Material]), VAR MaxDatePerMaterial = CALCULATE(MAX(InventoryJ[Date Ordered]), ALLEXCEPT(InventoryJ, InventoryJ[Material])) VAR UnitCost = CALCULATE(SUM(InventoryJ[Cost/Unit]), InventoryJ[Date Ordered] = MaxDatePerMaterial) VAR UnitsUsed = CALCULATE(SUM(InventoryJ[Unit Used]), InventoryJ[Date Ordered] = MaxDatePerMaterial) RETURN UnitCost * UnitsUsed )
这样不管是行级还是总计行,结果都会完全符合你的预期——每个物料用自己最后一次采购的成本和使用数量相乘,总计就是所有物料的这个乘积之和。
内容的提问来源于stack exchange,提问作者Atta
相关产品推荐
相关产品推荐

