Изменение кода DAX из вычисляемого столбца в меру

#dax #calculated-columns #measure

#dax #вычисляемые столбцы #измерение

Вопрос:

У меня есть таблица фактов со столбцами settlement_date, product_id, service_id, location_id, ticket_id и srv_adjusted_earning.

Я определил запрос DAX для генерации вычисляемого столбца, который суммирует столбец srv_adjusted_earning по диапазону дат: дата расчета и дата расчета — 27 дней (т. е. 4-недельное окно) как:

 =CALCULATE(
    SUM(factService[SRV_ADJUSTED_EARNING]),
    DATESBETWEEN
    (
        factService[SETTLEMENT_DATE],
        DATEADD(factService[SETTLEMENT_DATE], -27, DAY), 
        factService[SETTLEMENT_DATE]
    ),
    FILTER(factService, factService[PRO_ID] = EARLIER(factService[PRO_ID])),
    FILTER(factService, factService[SER_ID] = EARLIER(factService[SER_ID])),
    FILTER(factService, factService[LOC_ID_SELLING] = 
        EARLIER(factService[LOC_ID_SELLING])),
    FILTER(factService, factService[TIS_ID] = EARLIER(factService[TIS_ID]))
)
  

Я пытаюсь преобразовать этот вычисляемый столбец DAX в меру и попробовал следующее:

 blob:=CALCULATE
(
    SUM(factService[SRV_ADJUSTED_EARNING]),
    DATESBETWEEN
    (
        factService[SETTLEMENT_DATE], 
        DATEADD(factService[SETTLEMENT_DATE], -27, DAY), 
        factService[SETTLEMENT_DATE]
    ),
    ALLEXCEPT(factService, factService[PRO_ID]),
    ALLEXCEPT(factService, factService[SER_ID]),
    ALLEXCEPT(factService, factService[LOC_ID_SELLING]),
    ALLEXCEPT(factService, factService[TIS_ID])
)
  

Но я получаю:
Ошибка: Ошибка вычисления в мере ‘factService'[blob]: не удается определить единственное значение для столбца ‘SETTLEMENT_DATE’ в таблице ‘factService’. Это может произойти, когда формула измерения ссылается на столбец, который содержит много значений, без указания агрегирования, такого как min, max, count или sum, для получения единого результата.

Кто-нибудь знает, как я это исправляю?

Ответ №1:

Как указано в ошибке, проблема заключается в factService[SETTLEMENT_DATE] . В мере нет контекста строки, чтобы он знал, о какой дате вы говорите, поэтому вам нужно как-то указать это. Я бы предложил использовать переменную в следующих строках:

 blob :=
VAR SettleDate = MAX ( factService[SETTLEMENT_DATE] )
RETURN
    CALCULATE (
        SUM ( factService[SRV_ADJUSTED_EARNING] ),
        DATESBETWEEN (
            factService[SETTLEMENT_DATE],
            SettleDate - 27,
            SettleDate
        ),
        ALLEXCEPT (
            factService,
            factService[PRO_ID],
            factService[SER_ID],
            factService[LOC_ID_SELLING],
            factService[TIS_ID]
        )
    )
  

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

Комментарии:

1. Спасибо за ваш ответ. Это выдает ошибку: «Семантическая ошибка: первый аргумент «DATEADD» должен указывать столбец. Также я хочу использовать даты 28 относительно даты в строке, поэтому, учитывая 28 февраля, это будет с 1 по 28 февраля включительно. Не будет ли MAX принимать самую большую дату в факте?

2. Ах, я забыл DATEADD , что в качестве первого аргумента нужен столбец даты. Что касается MAX , оно принимает максимальное значение в текущем контексте фильтра, не обязательно по всей таблице фактов. Попробуйте мою правку.

3. Еще раз спасибо за быстрый ответ. Это устраняет семантическую ошибку, и вы правы в том, что МАКСИМАЛЬНОЕ значение находится в контексте фильтра. Я создал вычисляемое поле и сравнил с вычисляемым столбцом, и ответы те же, и я пометил ваше сообщение как правильный ответ. Я без радости просмотрел сеть и книгу Russo / Ferrari в поисках ответа, поэтому не могу достаточно отблагодарить вас за ваш пост. Хороший трюк с использованием переменной для принудительного использования контекста фильтра — я этого не забуду.