带日期过滤器的DAX累计总计

时间:2015-07-27 18:58:05

标签: excel powerpivot dax

我正在尝试计算订单仅在特定日期范围内有效的运行总计。每个订单都有一个值,一个开始日期和一个结束日期。我想仅在订单开始日期和结束日期之间的日期计算订单价值的累计总和。

我已经阅读累计总数的this article并且有一个运行总计的等式但是我无法弄清楚如何过滤等式,以便在日期表超过时过滤掉订单订单的结束日期。我当前的衡量标准为Cumulative Value:=CALCULATE(SUM(Orders[Vaue]), FILTER(ALL('Date'), [Date] <= MAX([Date]))),我想添加一个过滤器,过滤掉任何结束日期超过当前日期行的订单,类似于此Filter('Order', 'Orders'[Order_End_Date] < 'Date'[Date])。当我尝试添加此过滤器时,我收到错误,因为“日期”[日期]未在任何聚合中使用。

以下是我正在使用的数据模型以及a link to the Excel File数据模型。

Example Data Model

样本数据:
+-----------+ | Date | +-----------+ | 1/1/2015 | | 1/2/2015 | | 1/3/2015 | | 1/4/2015 | | 1/5/2015 | | 1/6/2015 | | 1/7/2015 | | 1/8/2015 | | 1/9/2015 | | 1/10/2015 | +-----------+

+----------+------+------------------+----------------+ | Order_Id | Vaue | Order_Start_Date | Order_End_Date | +----------+------+------------------+----------------+ | 1 | 1 | 1/1/2015 | 1/3/2015 | | 2 | 3 | 1/2/2015 | | | 3 | 6 | 1/3/2015 | 1/7/2015 | | 4 | 7 | 1/5/2015 | | +----------+------+------------------+----------------+

我当前测量的输出和正确测量的输出应该是什么 +-----------+-----------------+--------------------------+ | Date | Current Measure | Desired Measure's Output | +-----------+-----------------+--------------------------+ | 1/1/2015 | 1 | 1 | | 1/2/2015 | 4 | 4 | | 1/3/2015 | 10 | 9 | | 1/4/2015 | 10 | 9 | | 1/5/2015 | 17 | 16 | | 1/6/2015 | 17 | 16 | | 1/7/2015 | 17 | 10 | | 1/8/2015 | 17 | 10 | | 1/9/2015 | 17 | 10 | | 1/10/2015 | 17 | 10 | +-----------+-----------------+--------------------------+

2 个答案:

答案 0 :(得分:2)

Cumulative Value2:=CALCULATE(
    SUM(Orders[Vaue])
    ,FILTER(
        VALUES(Orders[Order_Start_Date])
        ,Orders[Order_Start_Date] <= MAX('Date'[Date])
    )
    ,FILTER(
        VALUES(Orders[Order_End_Date])
        ,ISBLANK(Orders[Order_End_Date])
            || Orders[Order_End_Date] >= MAX('Date'[Date])
    )
)

模型图(注意我拿出了你的日期关系 - 对于你提供的有限用例,只会让事情变得更复杂):

enter image description here

注意:我将在位置上引用函数参数,第一个参数由(1)表示。

所以,我们所做的与你所尝试的相似。我们有两个FILTER(),每个都作为我们的CALCULATE()的参数。 CALCULATE()将其参数(2) - (n)组合成逻辑和。

第一个FILTER()基本上完成了你已经在做的事情,除了我们过滤[Order_Start_Date]的不同值,将它们与数据透视表的当前过滤器上下文进行比较。

第二个FILTER()遍历[Order_End_Date]的不同值,检查逻辑或组合的两个条件。我们必须处理BLANK [Order_End_Date]的情况。此BLANK通常隐式转换为0 == 1899-12-30,这比我们考虑的任何日期都要少。在BLANK的情况下,我们从ISBLANK()获得一个真值,并且该行作为FILTER()的结果集的一部分返回。另一个测试只是检查[Order_End_Date]是否大于数据透视中的当前过滤器上下文日期。

答案 1 :(得分:0)

您所寻找的通常被称为“正在进行中的事件”问题。以下是一些可以帮助您解决问题的帖子。

我希望这会有所帮助。

- 汤姆