Здравствуйте! Прошу помочь с решением задачи. Прилично времени потратил на подбор решения, но не получается.
P.S.: Знаю, что пожалуй не стоит решать без SUMX + FILTER, SUMMARIZE + FILTER, но эти решение мне более понятны, чем CALCULATE.
Дано:
Таблица "Ученики"
Таблица "ДДС"
Таблица "Календарь"
Мера "! Баланс счёта на конец дня"
Мера "! Баланс счёта на конец дня + кол-во дней"
Модель данных построена
Ученики разных школ, открыли счета в банке "Гринготтс". Ученики хранят сбережения в 3-х валютах. Иногда ученики пополняют счёт, иногда снимают деньги. Если баланс положительный, то на него начисляется процент на остаток.
Необходимо: Вычислить кол-во дней между операциями. Полученное значение будет указывать на кол-во дней, которые баланс счёта не изменялся.
Пример:
Мера "! Баланс счёта на конец дня":
Код
! Баланс счёта на конец дня =
var DDSMaxDate = MAX('ДДС'[Дата])
return
CALCULATE(
SUMX(
------------------------------------------- Сборка таблицы со столбцами Дата, Клиент, Ставка %, Движение ДС -------------------------------------
SUMMARIZE( // Создаём таблицу
FILTER(
'ДДС',
'ДДС'[Валюта] = "RUR" // Фильтруем таблицу по одной валюте
),
'Календарь'[Date], // Календарь из справочника
'ДДС'[ID Ученика], // Уникальный номер клиента
'ДДС'[Ставка], // Добавляем в таблицу процентную ставку по выбранной валюте
'ДДС'[Сумма] // Добавляем столбец со всеми движениями ДС
),
[Сумма]), // Суммируем все движения ДС
------------------------------------------- Создаём конструкцию для подсчёта баланса на счёте на дату банковской операции ------------------------
FILTER(
ALLSELECTED('Календарь'),
'Календарь'[Date] <= DDSMaxDate
)
)
Мера "! Баланс счёта на конец дня + кол-во дней"
Код
! Баланс счёта на конец дня + кол-во дней =
var DDSMaxDate = MAX('ДДС'[Дата])
return
CALCULATE(
SUMX(
------------------------------------------- Сборка таблицы со столбцами Дата, Клиент, Ставка %, Движение ДС -------------------------------------
SUMMARIZE( // Создаём таблицу
FILTER(
'ДДС',
'ДДС'[Валюта] = "RUR" // Фильтруем таблицу по одной валюте
),
'Календарь'[Date], // Календарь из справочника
'ДДС'[ID Ученика], // Уникальный номер клиента
'ДДС'[Ставка], // Добавляем в таблицу процентную ставку по выбранной валюте
'ДДС'[Сумма] // Добавляем столбец со всеми движениями ДС
),
VAR DayQuantity =
IF(
ISBLANK('ДДС'[Дата]),
CALCULATE(
COUNTROWS('Календарь'),
FILTER(
'Календарь',
'Календарь'[Date] > 'ДДС'[Дата] && 'Календарь'[Date] <= MIN('ДДС'[Дата])
)
),
1)
RETURN DayQuantity
DayQuantity * [Сумма]), // Суммируем все движения ДС
------------------------------------------- Создаём конструкцию для подсчёта баланса на счёте на дату банковской операции ------------------------
FILTER(
ALLSELECTED('Календарь'),
'Календарь'[Date] <= DDSMaxDate
)
)
В этой мере хотел встроить VAR внутри SUMX () (такой приём я видел).
Еще актуален вопрос? Если честно, не понял, что вы пытаетесь посчитать второй (нерабочей) мерой. Только количество дней между двумя операциями?
Код
Количество дней между операциями =
IF(NOT(ISBLANK([Сумма ДДС])),
VAR _PrevDate = CALCULATE(LASTNONBLANK('ДДС'[Дата],[Сумма ДДС]), FILTER(ALL('Календарь'), 'Календарь'[Date]< MAX('Календарь'[Date])))
VAR _CurrentDate = MAX('Календарь'[Date])
RETURN DATEDIFF(_PrevDate,_CurrentDate,DAY)
)