2015-07-27 2 views
0

Я пытаюсь вычислить общее количество, в котором заказы действительны только в течение определенного диапазона дат. Каждый заказ имеет значение, дату начала и дату окончания. Я хочу рассчитать суммарную сумму значений заказа только в течение дат между датой начала заказа и датой окончания.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 | +-----------+-----------------+--------------------------+

ответ

0
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]) 
    ) 
) 

Model Diagram (обратите внимание, я вынул свою дату отношение - для ограниченного использования при предоставленных Вами, это только делает вещи более сложные):

enter image description here

Примечание. Я буду ссылаться на аргументы функции позиционно, с первым аргументом, представленным (1).

Итак, что мы делаем, похоже на то, что вы пытались. У нас есть два FILTER() s, каждый из которых является аргументом нашего 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] больше, чем текущая дата контекста фильтра в своде.

Смежные вопросы