Страницы: 1
RSS
Динамическая гранулярность данных средствами DAX?
 
Добрый день, коллеги! Мой вопрос, в основном для для знатоков и любителей DAX и Power BI. Есть набор данных по продажам и есть потребность смотреть на продажи в разрезе дней недели, недель и месяцев, иными словами изменить гранулярность в отчете с помощью среза (slicer). Данный срез состоит из соответствующих уровней гранулярности: дни, недели, месяцы и загружается в модель данных отдельной таблицей. Моя проблема в том, что я не могу сообразить какие меры я должен написать, чтобы данные выводились по дням, неделям и месяцам. При этом, как реализовать взаимодействие таблицы с данными и таблицы среза я хорошо понимаю. Вот код аналогичной реализации, который я планирую применить:

Код
Sales :=
    IF (
        HASONEVALUE ( Таблица-срез[Период] ),
        SWITCH (
            VALUES (Таблица-срез[Период] ),
            "дни", [Мера распределения по дням?],
            "недели", [мера распределния по неделям?],
            "месяцы", [мера распределния по месяцам?],
            BLANCK()
   ), [Сумма продаж])
Изменено: Denis87 - 20.07.2017 11:14:29
 
Я в PBI просто создал дополнительную таблицу. После чего связал свою БД (дата) с этой таблицей и когда я вывожу поле период (по 1 формуле) то в срез попадает именно год-квартал-месяц-день.
1 формула вводилась как новая табл. остальные через столбец.
Все допер, что Вы хотите. пару минут
Код
  Calendar =
  CALENDAR("01-01-2016";"12-31-2017")
  MonthNumber = MONTH ('Calendar'[Период])
  Месяц =  FORMAT('Calendar'[Период];"MMM")
  Year = YEAR('Calendar'[Период])
Изменено: Илья Демид - 20.07.2017 11:24:31
 
Илья Демид, спасибо, интересный подход. Сейчас попробую на своем примере.
 
Илья Демид, я правильно понял, что эти меры вы добавляете в виде столбцов к таблице Calendar, которую вы по формуле CALENDAR() создаете?

MonthNumber = MONTH ('Calendar'[Период])  
Месяц =  FORMAT('Calendar'[Период];"MMM")
Year = YEAR('Calendar'[Период])

И в итоге получается таблица из 4 столбцов, которую мы связываем с бд?
Изменено: Denis87 - 20.07.2017 11:39:52
 
Да, верно
я кстати делаю как Вы подразумевали, но только с числовым значением (т.е. мера), а вот как добавить ее в строки ума не приложу
Код
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 создать.
F1 творит чудеса
 
Максим Зеленский, скорее всего имелось ввиду изменения значения строк в зависимости от выбранного фильтра. т.е. если выбрать неделю то по строкам должен показываться № недели, если месяц то месяц. как сделать чтобы так считалось значение, я написал, а вот реально ли это реализовать для строк не уверен.
Изменено: Илья Демид - 20.07.2017 11:51:33
 
Максим Зеленский, похоже, что меры все-таки разные или я не понимаю сути решения на которую дал ссылку Илья Демид:

Код
Sales :=
    IF (
        HASONEVALUE ( Period[Period] ),
        SWITCH (
            VALUES ( Period[Period] ),
            "Current", [Internet Total Sales],
            "MTD", [MTD Sales],
            "QTD", [QTD Sales],
            "YTD", [YTD Sales],
            "PY Current", [PY Sales],
            "PY MTD", [PY MTD Sales],
            "PY QTD", [PY QTD Sales],
            "PY YTD", [PY YTD Sales],
            "YOY", [YOY Sales],
            "YOY%", [YOY Sales%],
            "YOY YTD", [YOY YTD Sales],
            "YOY% YTD", [YOY YTD Sales%],
            BLANK ()
        ),
        [Internet Total Sales]
    )


Здесь же явно разные меры переключаются методом SWITCH в зависимости от значения таблицы-среза, верно?
 
Да, но по строкам у вас останется 1 и тоже поле.
к примеру в формуле которую я писал "GWP / #". выводим в срез gwp or # (просто 2 ячейки). в поля сводной таблицы выводим в значения меру gwp / # (для gwp 1 мера, для # другая)., в строки филиалы. при переключении среза будет менятся мера, но филиалы нет
Изменено: Илья Демид - 20.07.2017 11:59:33
 
Илья Демид, а в случае примера из daxpatterns в строке [Internet Total Sales], которое не меняется, так?
 
Нет, все что указано в примере это просто пересчет меры в зависимости от выбранного значения в срезе.
Смотрите, при построении сводной таблицы у вас есть (картинка), вот все что туда попадет не будет меняться в зависимости от среза (разве что там значений не будет). Попробуйте скачать пример по той ссылке что я давал
 
Илья Демид, спасибо, буду разбираться.
 
Доброе время суток.
Цитата
Максим Зеленский написал:
А по каким периодам она группируется, зависит от того, что вы поставите в строки/столбцы таблицы (или соответствующие места визуалов)
Максим, при некотором желании, можно и тут делать динамически ;)
Вариант в Power BI Desktop.
 
Андрей VG,
вау, спасибо :)
Изменено: Илья Демид - 20.07.2017 14:27:37
 
Андрей VG, да, знакомая методика, делал так :)
неправильно понял вопрос Denis87
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
неправильно понял вопрос  Denis87
А может и правильно ;)  ТС мимо бегает - ни спасибо, ни что не так. В чёрный список напрашивается. :)  DAX для меня хобби, могу и сам для себя решать.
 
Цитата
Андрей VG написал:
ТС мимо бегает - ни спасибо, ни что не так
Простите, это вы про меня?
 
Андрей 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
Изменено: Denis87 - 24.07.2017 15:33:56
Страницы: 1
Читают тему
Наверх