У меня есть две таблицы под названием
Я хочу рассчитать два поля/меры на основе выбора среза даты из таблицы дат.
Пример: если я выбрал 4-й месяц, тогда он должен суммировать отдельный доход клиентов A и B за 4-й месяц как current_month_revenue и суммировать отдельный доход клиентов A и B за 3-й месяц как previous_month_revenue.
Я попытался написать следующую меру для расчета текущего_месяца_дохода, и она работает нормально, но не дает правильного результата для предыдущего_месяца_дохода. Я получаю то же значение и за предыдущий месяц.
'Measure Previous Month Revenue' =
IF (
ISFILTERED ( 'Date'[Year_Month] ),
VAR myTable =
SUMMARIZE (
'Main Table',
'Main Table'[ClientName],
'Main Table'[Mon],
'Main Table'[Revenue]
)
RETURN
CALCULATE (
SUMX (
myTable,
'Main Table'[Revenue]
),
FILTER (
'Main Table',
'Main Table'[Mon]
= SELECTEDVALUE ( 'Date'[Month] - 1 )
)
),
VAR myTable =
SUMMARIZE (
'Main Table',
'Main Table'[Revenue],
'Main Table'[Mon],
'Main Table'[Revenue]
)
RETURN
SUMX (
FILTER (
myTable,
'Main Table'[Mon]
= MONTH (
TODAY ()
) - 1
),
'Main Table'[Revenue]
)
)
Желаемый результат
Если выбран 4-й месяц
В этом случае оба одинаковы, но в фактических данных доход за каждый месяц разный.
CALCULATE не влияет на переменные, которые вы уже определили, поэтому FILTER ничего не делает с первым SUMX. См. этот пост по теме для более подробной информации.
Я бы предложил написать меру намного проще. Что-то вроде этого:
Previous Month Revenue =
VAR PrevMonth =
SELECTEDVALUE (
'Date'[Month],
MONTH ( TODAY () )
) - 1
RETURN
CALCULATE (
SUM ( 'Main Table'[Revenue] ),
'Main Table'[Mon] = PrevMonth
)
Да..Использовал его вместе с вышеперечисленным, чтобы получить желаемый результат.
Из кода я вижу, что таблица «Дата» имеет числовой столбец «Месяц», который, как я предполагаю, имеет тот же тип, что и столбец «Пн» в вашей «Основной таблице».
Кроме того, поскольку в «Основной таблице» нет года, я предполагаю, что год не следует учитывать.
Из слайсера над таблицей дат мы можем напрямую получить выбранную дату [месяц] с помощью SELECTEDVALUE(). В качестве параметра по умолчанию мы используем текущий месяц, полученный функцией TODAY().
Затем мы получаем предыдущий месяц, вычитая один из выбранного месяца, и мы можем использовать его для среза таблицы, сгруппированной по CustomerName, Mon и Revenue. Группировка необходима для удаления повторяющихся доходов для одного и того же клиента в том же месяце и реализуется с помощью SUMMARIZE().
В качестве последнего шага мы можем агрегировать «Основную таблицу» [Доход] отфильтрованной и сгруппированной таблицы, используя SUMX.
'Measure Previous Month Revenue' =
VAR CurrentMonth =
MONTH(
TODAY()
)
VAR SelectedMonth =
SELECTEDVALUE(
'Date'[Month],
CurrentMonth
)
VAR PrevMonth = SelectedMonth - 1
VAR MyTable =
CALCULATETABLE(
SUMMARIZE(
'Main Table',
'Main Table'[ClientName],
'Main Table'[Mon],
'Main Table'[Revenue]
),
'Main Table'[Mon] = PrevMonth,
REMOVEFILTERS( 'Date' )
)
VAR Result =
SUMX(
MyTable,
'Main Table'[Revenue]
)
RETURN
Result
Тот же код, но для расчета предыдущего месяца, можно записать для текущего месяца.
'Measure Current Month Revenue' =
VAR CurrentMonth =
MONTH(
TODAY()
)
VAR SelectedMonth =
SELECTEDVALUE(
'Date'[Month],
CurrentMonth
)
VAR MyTable =
CALCULATETABLE(
SUMMARIZE(
'Main Table',
'Main Table'[ClientName],
'Main Table'[Mon],
'Main Table'[Revenue]
),
'Main Table'[Mon] = SelectedMonth,
REMOVEFILTERS( 'Date' )
)
VAR Result =
SUMX(
MyTable,
'Main Table'[Revenue]
)
RETURN
Result
Лучшее решение может быть реализовано путем установки связи между таблицей «Дата» и «Основной таблицей». В зависимости от бизнес-требований можно использовать таблицу дат с детализацией на уровне месяца со столбцом YearMonth вместо столбца Mon или на уровне дня со столбцом Date вместо столбца Mon.
Используя вышеизложенное, мера дает правильные результаты, поскольку на слайсере ничего не выбрано, но я получаю пустое значение, если выбираю какой-то другой месяц. Примечание. Мой слайсер создается с использованием поля «Год-месяц» из таблицы дат. Да, существует связь между таблицей дат и основной таблицей, которые связаны по ключу даты.
Итак, в «Основной таблице» есть столбец «Дата» и связь между этим столбцом и «Датой» [Дата]. Затем эту меру можно изменить, удалив фильтр «Дата».
Ура !! это работает, спасибо @sergiom Спасибо за вашу помощь. REMOVEFILTERS('Date') была недостающей частью. Не могли бы вы помочь мне понять, почему мы использовали эту строку?
Нам нужно удалить фильтрацию, введенную связью между таблицей Date и основной таблицей. Это связано с тем, что выборка в слайсере распространяется из таблицы дат в основную таблицу в соответствии с отношением. Но вместо этого мы хотим применить фильтр к столбцу Mon, поэтому мы должны избавиться от этого фильтра, и REMOVESFILTERS('Date') делает следующее: удаляет фильтр, распространяющийся из таблицы Date в основную таблицу. Эффект REMOVEFILTERS является локальным для функции CALCULATE, где она применяется. После удаления фильтра применяется фильтр над столбцом Mon.
Знание того, что модель содержит связь между таблицей Date и таблицей Main Table, позволит написать показатель, использующий функции анализа времени, без необходимости использовать столбец Mon. Но это будет другой Вопрос с описанием модели, грануляром таблицы «Дата» и подтверждением того, что столбец «Пн» содержит тот же месяц, что и дата, используемая для отношения.
Ааа... Спасибо за объяснение, помогло в написании других формул.
Это поможет респондентам представить ваши данные в текстовом виде, а не в виде изображения.