DAX - 每个维度的 LASTNONBLANK

DAX - LASTNONBLANK per dimension

我有一个 table 跨部门工资支付("Days from Y" = 从年初开始的天数,"Days to M" = 到月底的天数)

Department | Salary | Date       | Type            | Days from Y | Days to M
-----------+--------+------------+-----------------+-------------+-----------
Finance    |     71 | 01-01-2016 | Regular payment |           1 |        30
Sales      |   3000 | 20-01-2016 | Regular payment |          20 |        11
Sales      |   -300 | 21-01-2016 | Correction      |          21 |        10
Finance    |   2000 | 01-02-2016 | Regular payment |          32 |        27
Sales      |   3100 | 15-02-2016 | Regular payment |          46 |        12

对于定期付款,需要更正工资以显示为整月。但是,下个月不能包括上个月的更正(因为新工资已经规定了) - 只应该包括上个月的更正!

对于销售,这将是:

Date           | Salary | Salary (cum.) | Correction | Salary (corr.) cum.
---------------------------------------------------------------------------
2016           |   5800 |          5800 |            |            
  2016-01      |   2700 |          2700 |       1650 |                4350
    2016-01-20 |   3000 |          3000 |       1650 |                4650
    2016-01-21 |   -300 |          2700 |            |                4350
  2016-02      |   2550 |          5250 |       2040 |                7290
    2016-02-15 |   2550 |          5250 |       2040 |                7290

计算更正本身非常简单:如果是定期付款,则使用该日期计算给定月份-部门组合的更正。

使用 LASTNONBLANK 表达式,我可以做出适用于单个部门的正确累积度量:

Salary (corr.) cum := CACLULATE(MAX([Correction]); LASTNONBLANK([Date]; MAX([Correction])

但是,这不适用于跨部门 - 对于 2016-01 年,这会导致错误的总计数器:

Department | Salary | Salary (cum.) | Correction | measure | should be
-----------------------------------------------------------------------
(Total)    |   2771 |          3071 |            |    4721 |      6851    
  Finance  |     71 |            71 |       2130 |    2201 |      2201
  Sales    |   2700 |          3000 |       1650 |    4650 |      4650

如何创建一个能够正确计算每个月的更正值并获得正确总计的度量值?

(所以基本上它会查看每个部门(或其他维度)的最后一次更正 ,并使用这些总和而不是所有部门的最后一次更正尺寸)

您基本上需要遍历部门。

Salary (corr.) cum := 
SUMX (
    Departments,
    CACLULATE(MAX([Correction]); LASTNONBLANK([Date]; MAX([Correction])
)

这应该可以解决问题。

阿尔贝托