Dax для событий, происходящих в конце периода с использованием таблицы дат - PullRequest
2 голосов
/ 05 июня 2019

Мне нужно подвести итоги по всем долларам всех открытых возможностей по дате.К каждой записи прикреплены [действительны с] и [действительны до] даты.Когда возможность обновляется в БД, добавляется новая строка с [действителен с] дата = сегодня и [действителен до] дата = конец времени (31.12.2100).В предыдущей строке [действует до] дата получает вчерашнюю дату.

Причина: поскольку возможность может изменяться много раз в день, мы заботимся только о версии из каждого дня, которая пересекает порог 11:59:59.Когда возможность изменяется, предыдущая версия была действительной только до конца предыдущего дня, поэтому она получает дату предыдущего дня для своего поля [valid to].

При разбивке по единицам больше датыМне нужна последняя правильная версия возможности в то время.Например, сумма в долларах за январь - это сумма самой последней долларовой стоимости возможности 1/31 в 11:59:59.

Вот упрощенная версия моей схемы:

Imgur

Вот некоторые примеры данных:

Opp Number  Dollars Opp Created Date    Header Valid From   Header Valid To
1           100         1/1/2019        1/1/2019            1/3/2019
1           50          1/1/2019        1/4/2019            1/5/2019
1           75          1/1/2019        1/6/2019            12/31/2100
2           200         1/3/2019        1/3/2019            1/4/2019
2           210         1/3/2019        1/5/2019            1/6/2019
2           250         1/3/2019        1/7/2019            12/31/2100

Для данного примера набора данных сводная таблица должна выглядеть следующим образом:

Dates   Sum of Dollars
1/1/2019    100
1/2/2019    100
1/3/2019    300
1/4/2019    250
1/5/2019    260
1/6/2019    285
1/7/2019    325
1/8/2019    325
...
1/31/2019   325
January     325

Я пробовал несколько подходов, но ничего не получилось.Вот ссылки, которые я попробовал:

Мне удалось заставить это работать так, как и ожидалось, в dax studio, но я не могу перевести это в меру.

EVALUATE
ADDCOLUMNS (
    VALUES ( 'DIM Date'[Date]),
    "Open Orders",
    SUMX (
        FILTER (
            GENERATE (
                SUMMARIZE (
                    'FACT Opportunity',
                    'FACT Opportunity'[header valid from],
                    'FACT Opportunity'[header valid to],
                    "Rows",
                    DISTINCTCOUNT ( 'FACT Opportunity'[Opp Number])
                ),
                DATESBETWEEN (
                    'DIM Date'[Date],
                    'FACT Opportunity'[header valid from],
                    'FACT Opportunity'[header valid to]
                )
            ),
            'DIM Date'[Date] = EARLIER ('DIM Date'[Date])
        ),
        [Rows]
    )
)

1 Ответ

1 голос
/ 06 июня 2019

Я понял это.Мне не хватало функции ALL () , чтобы исключить контекстный переход, выполняемый функцией CALCULATE ().Я также использовал LASTDATE () вокруг функции VALUES (), чтобы получить последнюю дату в любом заданном контексте.Это дает мне сумму за последнюю дату в любом заданном месяце / qtr / year в иерархии.
Вот код, который я использовал:

Active Opps:=
SUMX(
    LASTDATE( VALUES ( 'DIM Date'[Date] ) ),
    VAR CurrentDate = 'DIM Date'[Date]
    VAR OrderedBeforeCurrentDate =
        FILTER (
            ALL ( 'FACT Opportunity'[header valid from]), 
            'FACT Opportunity'[header valid from] <= CurrentDate 
        )
    VAR ShippedAfterCurrentDate =
        FILTER (
            ALL ( 'FACT Opportunity'[header valid to] ), 
            'FACT Opportunity'[header valid to] >= CurrentDate 
        )
    RETURN
        CALCULATE (
            DISTINCTCOUNT( 'FACT Opportunity'[Opp Number]),
            OrderedBeforeCurrentDate,
            ShippedAfterCurrentDate,
            ALL ( 'DIM Date' )
        )
)

Найден шаблон здесь: https://www.sqlbi.com/articles/analyzing-events-with-a-duration-in-dax/

...