Добрый день, коллеги! Мой вопрос, в основном для для знатоков и любителей DAX и Power BI. Есть набор данных по продажам и есть потребность смотреть на продажи в разрезе дней недели, недель и месяцев, иными словами изменить гранулярность в отчете с помощью среза (slicer). Данный срез состоит из соответствующих уровней гранулярности: дни, недели, месяцы и загружается в модель данных отдельной таблицей. Моя проблема в том, что я не могу сообразить какие меры я должен написать, чтобы данные выводились по дням, неделям и месяцам. При этом, как реализовать взаимодействие таблицы с данными и таблицы среза я хорошо понимаю. Вот код аналогичной реализации, который я планирую применить:
Код
Sales :=
IF (
HASONEVALUE ( Таблица-срез[Период] ),
SWITCH (
VALUES (Таблица-срез[Период] ),
"дни", [Мера распределения по дням?],
"недели", [мера распределния по неделям?],
"месяцы", [мера распределния по месяцам?],
BLANCK()
), [Сумма продаж])
Я в PBI просто создал дополнительную таблицу. После чего связал свою БД (дата) с этой таблицей и когда я вывожу поле период (по 1 формуле) то в срез попадает именно год-квартал-месяц-день. 1 формула вводилась как новая табл. остальные через столбец. Все допер, что Вы хотите. пару минут
Код
Calendar =
CALENDAR("01-01-2016";"12-31-2017")
MonthNumber = MONTH ('Calendar'[Период])
Месяц = FORMAT('Calendar'[Период];"MMM")
Year = YEAR('Calendar'[Период])
Да, верно я кстати делаю как Вы подразумевали, но только с числовым значением (т.е. мера), а вот как добавить ее в строки ума не приложу
Код
GWP / # =
IF (
HASONEVALUE ( 'GWP or #'[GWP or #] ); (в этой таблице у меня 2 значения "GWP и #" (типо деньги и кол-во)
SWITCH (
VALUES ( 'GWP or #'[GWP or #] );
"GWP"; IF (
HASONEVALUE ( 'YTD or Month'[YTD or Month] );
SWITCH (
VALUES ( 'YTD or Month'[YTD or Month] ); (Тут тоже 2 значения (как считать) накопительно или за месяц
"YTD"; [YTD 2017 GWP];
"Month"; [M 2017 GWP];
BLANK ()
);
BLANK ()
);
"#"; IF (
HASONEVALUE ( 'YTD or Month'[YTD or Month] );
SWITCH (
VALUES ( 'YTD or Month'[YTD or Month] );
"YTD"; [YTD 2017 #];
"Month"; [M 2017 #];
BLANK ()
);
BLANK ()
);
BLANK ()
)
)
Более подробно откуда я это взял есть тут - Ссылка
Мера по неделям и пр. вообще-то одна и та же: SUM(Table[SalesAmount]). А по каким периодам она группируется, зависит от того, что вы поставите в строки/столбцы таблицы (или соответствующие места визуалов). Поставите номера недель - будет неделя. Поставите месяцы - будут месяцы. Календарь с нужными грануляциями можно так, как написал Илья Демид, а можно и в PQ создать.
Максим Зеленский, скорее всего имелось ввиду изменения значения строк в зависимости от выбранного фильтра. т.е. если выбрать неделю то по строкам должен показываться № недели, если месяц то месяц. как сделать чтобы так считалось значение, я написал, а вот реально ли это реализовать для строк не уверен.
Да, но по строкам у вас останется 1 и тоже поле. к примеру в формуле которую я писал "GWP / #". выводим в срез gwp or # (просто 2 ячейки). в поля сводной таблицы выводим в значения меру gwp / # (для gwp 1 мера, для # другая)., в строки филиалы. при переключении среза будет менятся мера, но филиалы нет
Нет, все что указано в примере это просто пересчет меры в зависимости от выбранного значения в срезе. Смотрите, при построении сводной таблицы у вас есть (картинка), вот все что туда попадет не будет меняться в зависимости от среза (разве что там значений не будет). Попробуйте скачать пример по той ссылке что я давал
Максим Зеленский написал: А по каким периодам она группируется, зависит от того, что вы поставите в строки/столбцы таблицы (или соответствующие места визуалов)
Максим, при некотором желании, можно и тут делать динамически Вариант в Power BI Desktop.
Андрей VG, то, что искал, спасибо! Ваше решение понятно, кроме одного момента, если не трудно, прокомментируйте, пожалуйста, .Все понял, кроме этого выражения:
Код
var result = IF(COUNTROWS(dateInterval) = 1
Весь код, на всякий случай:
Код
Прадажи = Var step = VALUES('Срез'[Наименование])
Var dateInterval = CALCULATETABLE(VALUES('Строки'[Значение]); step)
var result = IF(COUNTROWS(dateInterval) = 1;
SWITCH(step;
"Дни"; CALCULATE(SUM('dataTable'[Продажи]); 'dataTable'[Дни] = dateInterval);
"Недели"; CALCULATE(SUM('dataTable'[Продажи]); 'dataTable'[Недели] = dateInterval);
"Месяцы"; CALCULATE(SUM('dataTable'[Продажи]); 'dataTable'[Месяцы] = dateInterval);
BLANK() );
BLANK())
return result