DAX - 每个维度的LASTNONBLANK

时间:2016-09-01 12:14:37

标签: ssas dax ssas-tabular

我有一张表,其中包含跨部门的工资支付(" Y&#34的天数; =年初以来的天数,"天数到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

如何创建一个正确计算每个月更正的度量,并使总数正确?

(所以基本上它会查看每个部门(或其他维度)的最后修正并使用这些的总和而不是所有维度的最后修正) < / p>

1 个答案:

答案 0 :(得分:2)

你基本上需要遍历部门。

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

这应该可以解决问题。

阿尔贝托