DAX сумма умножения (sumproduct) для нескольких таблиц - PullRequest
1 голос
/ 07 февраля 2020

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

Я пытаюсь получить значения "MTD target" из произвольного выбора даты. У меня есть таблица out, которая имеет много измерений + дата, а также целевая таблица, которая дает мне постоянное целевое значение в день для каждого месяца. Моя цель состоит в том, чтобы получить количество дней, выбранных в каждом КАЖДОМ месяце, и умножить его на соответствующую дневную цель для соответствующего месяца.

Например, дневная цель месяца 1 - 2, дневная цель месяца 2 - 4. I у меня 4 дня в месяце 1 и 3 дня в месяце 2. Моя совокупная цель должна быть 2 * 4 + 3 * 2 = 14.

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

Таблица «out» имеет дату, страну и другие измерения. Таблица 'target' имеет размерность года, месяца и страны.

Я пытаюсь получить некоторое объединение и умножение, что-то вроде SUM (month_country * selected_days)

Вот меры DAX Я пробовал:

mtd_inv_tgt :=
CALCULATE (
    SUM ( targets[daily_spend] ),
    FILTER (
        targets,
        targets[market] = FIRSTNONBLANK ( out[co_market], "" )
            && targets[yyyymm] >= MIN ( out[yyyymm] )
            && targets[yyyymm] <= MAX ( out[yyyymm] )
    )
)
    * DISTINCTCOUNT ( out[date] )
mtd_inv_tgt :=
SUMX (
    FILTER (
        targets,
        targets[market] = FIRSTNONBLANK ( out[co_market], "" )
            && targets[yyyymm] >= MIN ( out[yyyymm] )
            && targets[yyyymm] <= MAX ( out[yyyymm] )
    ),
    targets[daily_spend] * DISTINCTCOUNT ( out[date] )
)

Это прекрасно работает, если выбранные даты принадлежат одному месяцу. Если я выберу 2 месяца, это добавит ежедневные расходы за 2 месяца, а затем умножит их на число дат, охватывающих 2 месяца. Как и в приведенном выше примере, это будет (2 + 3) * (4 + 2) = 30, что, очевидно, неверно.

Предостережение: я не могу использовать SUMX для таблицы out, потому что Есть много записей на дату + страну, в то время как цели - одна запись в месяц + страна.

1 Ответ

0 голосов
/ 07 февраля 2020

Я думаю, что-то похожее на это должно работать:

mtd_inv_tgt :=
SUMX (
    VALUES ( out[date] ),
    LOOKUPVALUE (
        targets[daily_spend],
        targets[yyyymm], SELECTEDVALUE ( out[yyymm] )
    )
)

Это перебирает каждое отдельное значение out[date] в текущем контексте фильтра и складывает daily_spend для каждой из тех дат, которые оно просматривает вверх путем сопоставления на yyymm.


Итерирование только по yyymm может быть более эффективным:

mtd_inv_tgt :=
SUMX (
    VALUES ( out[yyymm] ),
    DISTINCTCOUNT ( out[date] )
        * LOOKUPVALUE (
            targets[daily_spend],
            targets[yyyymm], EARLIER ( out[yyymm] )
        )
)

Примечание. Если они не работают как ожидается, пожалуйста, предоставьте образцы данных для проверки, поскольку я фактически не проверял их.

...