Вычислите меру, включающую даты, в таблице фактов с DAX - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть эта проблема: с учетом «Движений» factTable , который содержит список транзакций склада.

Я хочу знать, сколько предметов поступило, сколько было отправлено (и этотривиально) но также сколько "В заказе" в определенное время (и это сложная часть)

Таким образом, каждая строка может быть либо квитанцией (она имеет положительныйзначение «qIn») или отгрузка (положительное значение qOut)

Например, очень простой список записей может быть:

ID  Item    TransactionDate OrderDate   qIn qOut
1   A       2019-01-30      2019-01-10  5   0
2   A       2019-02-20      2019-01-15  3   0
3   A       2019-03-12      2019-01-20  0   6
4   A       2019-03-30      2019-02-20  20  0

Это означает:
На TransactionDate 2019-01-30 Товаров A поступило в количестве 5. Заказ на это был создан 2019-01-10: таким образом, за эти 20 дней было 5 заказанных товаров.Однако, когда я смотрю в конце января, я должен увидеть 0 для этой транзакции в «заказанном» показателе, потому что он прибыл 30 января.

Вместо этого для второй записи, в конце января Iдолжен видеть, что количество 3 было «в порядке», потому что фактическое прибытие было в 2019-02-20.

Таким образом, в конце строки в сводной таблице Excel должна отображаться ситуация, аналогичнаяна это:

    Year    2019
    Month   January         February        March
            IN | Ord        IN | Ord        IN | Ord
Item
A           5      3         3    20        20   0

Простая мера qIn:

qIN := SUM(Transactions[qtaIn])

Мера заказанного количества, которое я уже выяснил в данный момент (это ничего не делает!):

orderedQty :=
CALCULATE (
    SUMX ( Transactions; Transactions[qIn] );
    DATESBETWEEN (
        Transactions[TransactionDate];
        MINX ( Transactions; Transactions[OrderDate] );
        MAXX ( Transactions; Transactions[TransactionDate] )
    )
)

РЕДАКТИРОВАТЬ

Мера "InOrder" должна быть "аддитивной" в том смысле, что она должна учитывать не только то, что произошло втекущий месяц, но также , сколько InOrder из прошлых месяцев еще не получено.

С картиной (но это было бы нужно сделать ...) все было бы яснее, по крайней мере, с логической точки зрения.Однако, как и в случае с картиной, я не вижу, как извлечь из этой логики «прямые меры».

Вместо этого, используя меры, уже предоставленные @Olly, проблему можно переформулировать следующим образом:

InOrderFromOtherMonths :=  Sum (qIn) where Order Month <> Current Month

(то есть, сколько поступило в текущем месяце, полученном из заказов, принятых в прошлые месяцы)

InOrder := Total sum of (ORDER measure)  -  InOrderFromOtherMonths

PS.Я создал файл Excel с немного более интересным примером.
enter image description here В этом файле, используя "картинку прямого измерения", значение InOrder для января будет: ID 2 + ID 5 + ID 6 (заказы пока открыты в конце января).В значениях = 3 + 9 + 17 = 29

При «косвенной» мере было бы:

Total sum of ORDER = 15+23+12=50
InOrderFromOtherMonths = 6+15=21
InOrder = Total sum of ORDER - InOrderFromOtherMonths = 50 - 21 = **29**

1 Ответ

1 голос
/ 12 апреля 2019

Создание таблицы календаря, включая поле YYYY-MM.Если у вас еще нет календарной таблицы, вы можете автоматически создать ее в PowerPivot: Design > Date Table > New

Создать АКТИВНОЕ отношение между Calendar[Date] и Transactions[TransactionDate]

Создать НЕАКТИВНОЕ отношениемежду Calendar[Date] и Transactions[OrderDate]

enter image description here

Теперь создайте свои меры:

Измерение IN:

IN:=SUM ( Transactions[qIn] )

Измерьте ЗАКАЗЫ:

ORDERS:=
CALCULATE ( 
    SUM ( Transactions[qIn] ),
    USERELATIONSHIP ( 'Calendar'[Date], Transactions[OrderDate] )
)

Измерьте ЗАКАЗ:

ORDER:=
IF ( 
    HASONEVALUE ( 'Calendar'[YYYY-MM] ),
    CALCULATE ( 
        [ORDERS], 
        FORMAT ( Transactions[TransactionDate], "YYYY-MM" ) <>  VALUES ( 'Calendar'[YYYY-MM] )
    )
)

И поверните, чтобы удовлетворить:

enter image description here

РЕДАКТИРОВАТЬ

После того, как ваш вопрос отредактирован, некоторые из ваших ярлыков смущают, но попробуйте создать следующие меры:

Измерение: Заказано

Ordered:=
CALCULATE ( 
    SUM ( Movements[qIn] ),
    USERELATIONSHIP ( 'Calendar'[Date], Movements[OrdDate] )
)

Измерение: Получено

Received:= SUM ( Movements[qIn] )

Измерение: Превосходно

Outstanding:= 
VAR EOMaxDate = 
    EOMONTH ( LASTDATE ( 'Calendar'[Date] ), 0 )
RETURN
    IF ( 
        ISBLANK ( [Ordered] ) && ISBLANK ( [Received] ),
        BLANK(),
        CALCULATE ( 
            [Ordered] - [Received],
            FILTER ( 
                ALL ( 'Calendar'), 
                'Calendar'[Date] <= EOMaxDate
            )
        )   
    )

Теперь используйте эти три показателя в своей оси:

enter image description here

Или, более четко:

enter image description here

См. https://excel.solutions/so_55596609-2/, например, файл XLSX

...