PowerBI - объединение нескольких строк с использованием комбинации фиксированных и переменных вычислений, сопоставленных с идентификатором в отдельной таблице - PullRequest
0 голосов
/ 12 октября 2018

У меня довольно сложный набор данных, но я постараюсь упростить его для этого поста.

У меня есть данные контракта в таблице F1_Contract в упрощенном формате:

F1_Contract_Sample

Я пытаюсь рассчитать ожидаемую прибыль от контрактов.Первое, что мне было нужно, - это рассчитать добавочный объем по каждому контракту, который действовал между текущей датой и следующей датой, в зависимости от среза даты, используемого в представлении.После большой боли и страданий кто-то указал мне на сообщение в StackOverflow, которое решило мою проблему:

Создайте таблицу отключенных дат, используйте ее в качестве среза даты, а затем вычислите разницу в датах между Current Date, START_DATE среза, Next Date и END_DATE среза.

Полученная мера равна

DELTA DATE =
CALCULATE (
SUMX (
    F1_Contract,
    DATEDIFF (
        MAX ( MAX ( F1_Contract[CURRENT_CONTRACT_DATE] ), [Disconnected_MIN_Date] ),
        MIN ( MAX ( F1_Contract[NEXT_CONTRACT_DATE] ), [Disconnected_MAX_Date] ),
        DAY
    )
),
FILTER (
    F1_Contract,
    F1_Contract[CURRENT_CONTRACT_DATE] <= [Disconnected_MAX_Date]
        && F1_Contract[NEXT_CONTRACT_DATE] >= [Disconnected_MIN_Date]
)
)

Затем я беру эту Меру и умножаю ее на VOLUME_PER_DAY, чтобы получить инкрементный объем для представления по следующей формуле:

Incremental Cumulative VOLUME = 
CALCULATE(SUMX(F1_Contract,F1_Contract[VOLUME_PER_DAY]* [DELTA DATE])) 

Чтобы вычислить F1 Revenue и F1 Cost, я беру F1 Unit Cost и соответствующие F1 price на основе добавочного объема и получаю следующие меры:

Incremental F1 Revenue =
CALCULATE (
    MAX (
        SUMX (
            F1_Contract,
            [Incremental Cumulative VOLUME] * [F1 Sell Rate @ GAD Per Shipment]
        ),
        [Calc F1 MinCharge]
    )
)


Incremental F1 Cost =
CALCULATE (
    SUMX ( F1_Contract, [Incremental Cumulative VOLUME] * F1_Contract[F1_Cost] )
)

Все это прекрасно работает!Я могу создать отчет на уровне ID, Indicator или на уровне Lane, и все числа верны.

Проблема в том, что у меня есть вторая таблица доходов, F2_Contract_Revenue, который состоит из доходов F2, отформатированных следующим образом (обратите внимание, что может быть от 0 до 15 строк в F2_Contract_Revenue для любого заданного ID в F1_Contract)

F2_Contract_Revenue:

Corrected F2_Contract_Revenue

Хотя ID в F1_Contract уникален, просто чтобы быть в безопасности, у меня есть отдельная таблица DISTINCT_ID, которую я использовал для связи ID с F1_Contract иF2_Contract_Revenue.

Теперь мне нужно рассчитать доход F2 для каждого ID;используя визуальную формулу:

If(BASIS = “FLAT”, F2_Unit_Rev, MAX(F2_Min, (Incremental Volume * F2_Unit_Rev))

Мера, которую я создал после примерно 30 попыток:

F2 Revenue =
CALCULATE (
(
    SUMX (
        F2_Contract_Revenue,
        (
            MAX (
                [Incremental Cumulative VOLUME]
                    * IF ( F2_Contract_Revenue[BASIS] = "RATE",
                           F2_Contract_Revenue[F2_Unit_Rev], 0 ),
                F2_Contract_Revenue[F2_Min]
            )
        )
            + IF ( F2_Contract_Revenue[BASIS] = "FLAT",
                   F2_Contract_Revenue[F2_Unit_Rev], 0 )
    )
),
FILTER (
    F2_Contract_Revenue,
    F2_Contract_Revenue[ID] = RELATED ( F1_Contract[ID] )
)
)

Это работает правильно на уровне Lane.Однако в представлениях на уровне ID он немного отключен (я не смог отследить почему), а на уровне Indicator экспоненциально отключен.

Мне нужно использовать этов формуле, которая будет представлена ​​как F1 Revenue + F2 Revenue – F1 Cost, которая, конечно, также экспоненциально отключена на уровне INDICATOR (обратите внимание, что есть несколько строк INDICATOR = 1 и одна строка INDICATOR = 2).

Данные являются собственностью, поэтому я не могу поделиться файлом PowerBI, однако я могу ответить на более конкретные вопросы с данными, которые я очистил здесь.

Любые советы, мысли, исправления, помощь очень ожидается и ценится !!!

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

прочитав намного больше постов и просмотрев полезные видео, я определил, что проблема заключается в упорядочении значений в моем операторе агрегации, а также в недостаточном ограничении измерения времени.
У меня есть три шага а) дляв каждой строке таблицы F2 определите, является ли значение FLAT или RATE;если FLAT, используйте это значение, если RATE, затем умножьте это значение на динамическую меру, определяющую объем на основе отчета Date Slicer b) сравните результат FLAT или RATE со значением MIN в таблице c) агрегируйте эти значения, используясвязь между таблицами F1 и F2.
Работает следующий расчет: F2 = CALCULATE (SUMX(F2_Contract_Revenue, ((MAX(IF(F2_Contract_Revenue[BASIS]="RATE",F2_Contract_Revenue[F2_Unit_Rev]* [Incremental Cumulative Volume],F2_Contract_Revenue[F2_Unit_Rev]),F2_Contract_Revenue[F2_MIN]))) ) ,FILTER(F2_Contract_Revenue,F2_Contract_Revenue[ID]=RELATED(F1_Contract[ID])) ,FILTER ( F1_Contract, F1_Contract[CURRENT_CONTRACT_DATE] <= [Disconnected_MAX_Date] && F1_Contract[NEXT_CONTRACT_DATE] >= [Disconnected_MIN_Date] ))

Я благодарен за ответ, и для следующего выпуска я создам универсальный модуль, который я могу опубликовать в качестве примера.

0 голосов
/ 13 октября 2018

[Предлагаю вам показать модель с направлением связи]

При быстром рассмотрении этого, я думаю, проблема в модель данных - направление связи.

вы отлично работаете над [Инкрементальный доход F1] (уровень ID, уровень индикатора или уровень Lane).все они находятся в «таблице F1».

Но, когда дело доходит до [F2 Доход], вы получаете проблему.

(мера включает «таблицу F1» & 'Таблица F2 ').

FILTER (F2_Contract_Revenue, F2_Contract_Revenue [ID] = RELATED (F1_Contract [ID])

Также вы сказали, что вы

просто чтобы быть в безопасности, у меня есть отдельная таблица DISTINCT_ID

, поэтому я хотел бы отметить, можете ли вы показать свою модель (dimTable - factTable) для проблемной съемки.

В Dax все дело в Relation и Model XD (после того, как вы так много знаете о dax, модель может стать настоящей проблемой.)

...