Страницы: 1
RSS
Первый и пследний день недели числами вместо номера недели в DAX
 
Уважаемые эксперты, доброго времени суток!
Прошу помочь со следующим вопросом:
есть таблица дат Power Bi,
вместо номера недели 30-2018 я хотел бы видеть 23-29.07.(первое и последнее число недели,год можно не писать)
прежде чем сюда написать просмотрел тут и еще_тут и даже календарь у итальянцев скачал.
4 часа поисков и анализа не дали мне результатов.
Свое решение в excel прилагаю .
С уважением, Lari.
 
А принципиально в DAX? В PQ думаю попроще будет такое сгенерить.
Вот горшок пустой, он предмет простой...
 
PooHkrd, дело в том что таблицу дат создал через "Календарь = CALENDARAUTO()" и когда открываю запрос, там этой таблицы нет из чего я сделал выводы что через PQ не получится. Но мне не принципиально.
Я так понимаю тут версия для PQ как раз.
Изменено: Lari - 03.08.2018 16:57:15
 
Ну тогда вот формула для вычисляемого столбца с первым днем недели. Остальное, думаю сами доделаете:
Код
=CALCULATE(
   MIN('Таблица1'[Дата]);
   FILTER(
      ALL('Таблица1'[Дата]);
      'Таблица1'[Номер недели]=EARLIER('Таблица1'[Номер недели])
   )
)

Эта формула, кстати полностью повторяет логику формул массива из вашего файла-примера.
Изменено: PooHkrd - 03.08.2018 17:02:20
Вот горшок пустой, он предмет простой...
 
На всякий случай для PQ:

Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Дата", type date}}),
    #"Вставлено: начало недели" = Table.AddColumn(#"Измененный тип", "Начало недели", each Date.StartOfWeek([Дата]), type date),
    #"Вставлено: конец недели" = Table.AddColumn(#"Вставлено: начало недели", "Конец недели", each Date.EndOfWeek([Дата]), type date),
    #"Извлеченные первые символы" = Table.TransformColumns(#"Вставлено: конец недели", {{"Начало недели", each Text.Start(Text.From(_, "ru-RU"), 2), type text}}),
    #"Извлеченные первые символы1" = Table.TransformColumns(#"Извлеченные первые символы", {{"Конец недели", each Text.Start(Text.From(_, "ru-RU"), 2), type text}}),
    #"Вставлено: месяц" = Table.AddColumn(#"Извлеченные первые символы1", "Месяц", each Date.Month([Дата]), Int64.Type),
    #"Добавленный префикс" = Table.TransformColumns(#"Вставлено: месяц", {{"Месяц", each "0" & Text.From(_, "ru-RU"), type text}}),
    #"Извлеченные последние символы" = Table.TransformColumns(#"Добавленный префикс", {{"Месяц", each Text.End(_, 2), type text}}),
    #"Вставлено: объединенный столбец" = Table.AddColumn(#"Извлеченные последние символы", "Сведено", each Text.Combine({[Начало недели], [Конец недели]}, "-"), type text),
    #"Вставлено: объединенный столбец1" = Table.AddColumn(#"Вставлено: объединенный столбец", "Сведено.1", each Text.Combine({[Сведено], [Месяц]}, "."), type text),
    #"Другие удаленные столбцы" = Table.SelectColumns(#"Вставлено: объединенный столбец1",{"Сведено.1"})
in
    #"Другие удаленные столбцы"
 
PooHkrd, о, крутяк, спасибо Вам за помощь.

Буду разбирать.
 
alexleoix, благодарю, но моей таблицы дат нет в PQ поэтому не смогу применить Ваш код.
 
Lari, может ещё кому пригодится... ;)
 
Цитата
Lari написал:
моей таблицы дат нет в PQ
Календарь генерится функцией List.Dates(), где обычно стартовой датой ставят минимальную дата в таблице фактов, а финальной 31 декабря текущего года.
Как пример функция от Андрей VG
Код
let
    return = (minDate as date, maxDate as date, lang as text) =>
let
    base = Table.FromColumns( {List.Dates( minDate, Duration.Days(maxDate - minDate) + 1, #duration(1, 0, 0, 0) )}, {"Date"}),
    dateType = Table.TransformColumnTypes(base,{{"Date", type date}}),
    addYear = Table.AddColumn(dateType, "Year", each Date.Year(_[Date]), Int64.Type),
    addMonthName = Table.AddColumn(addYear, "Month Name", each Date.ToText(_[Date], "MMMM", lang), type text),
    addWeekdayName = Table.AddColumn(addMonthName, "Weekday Name", each Date.ToText(_[Date], "dddd", lang), type text)
    
in
    addWeekdayName
in
    return

А к полученному уже можно прикручивать то что предложил alexleoix
Просто календари лучше делать без расчетных полей, чтобы не нагружать модель данных лишними расчетами при обновлении.
Изменено: PooHkrd - 03.08.2018 17:34:42
Вот горшок пустой, он предмет простой...
 
Для вычисляемого столбца - практически как в Excel:
Код
=FORMAT([Дата]-WEEKDAY([Дата];3);"DD") & "-" & FORMAT([Дата]+7-WEEKDAY([Дата];2);"DD.MM")
F1 творит чудеса
 
PooHkrd, поскольку мне нужно будет использовать как фильтр, то я так понимаю что нужен вычисляемый столбец.
Максим Зеленский, Ваша формула у меня ассоциируется с мастерством на этом видео.

Спасибо за помощь.
 
Доброго времени суток!
При использовании формул  у меня возникли сложности:
1.формула #10, если год заканчивается в середине недели, формула  дает одинаковые интервалы для разных номеров, поэтому не получается сортировать по столбцу с неделями.(т.к. несколько значений для одного показателя)

2.PooHkrd, я попытался перенести Вашу формулу в Power BI,  и там она выдает циклическую ошибку. Главное в PP работает, а в P BI выдает ошибку. Может я что не так ввожу, но вроде и копировал, и вручную набирал, все одно.
Изменено: Lari - 06.08.2018 07:08:34
 
Lari, почему моя формула не переносится точно не помогу. А вот если с формулой Максима проблема только с сортировкой, то вам нужно сгенерить в календаре столбец вида Год_неделя , типа 2018_09. Потом скрываете его из клиентских средств. Далее в настройках РР (думаю в PBI тоже такое есть) указываете, что ваш столбец с диапазонами нужно сортировать через значения доп. столбца. И все будет ОК.
Вот горшок пустой, он предмет простой...
 
Убрал All и вроде заработало
Код
Неделя = format(
    CALCULATE(MIN ('Таблица1'[Дата]);
    FILTER('Таблица1'; 'Таблица1'[НомНед]=EARLIER('Таблица1'[НомНед]
    )));
    "DD")
    &"-"&
    format(CALCULATE
    (MAX('Таблица1'[Дата])
    ;FILTER('Таблица1';
    'Таблица1'[НомНед]=EARLIER('Таблица1'[НомНед])))
    ;"DD.MM")
 
PooHkrd, формула Максима на стыке 2016 и 2017 присваивала одно значение разным неделям, поэтому сортировать по полю Год-Неделя не получалось.
Из вашей формулы я убрал ALL.
В итоге я объединил вашу формулу с формулой Максима и вроде все работает.
С All выдавала циклическую ошибку.
Изменено: Lari - 06.08.2018 15:10:26 (Добавил коммент)
 
А так не проще?
Код
=FORMAT(MAX( DATE(YEAR([Дата]);1;1); [Дата]-WEEKDAY([Дата];3) );"DD") & 
 "-" & 
 FORMAT(MIN( DATE(YEAR([Дата]);12;31); [Дата]+7-WEEKDAY([Дата];2) );"DD.MM")

РР под рукой нет, формулу не проверял. Но если задумку поняли, то сами допилите. Все таки нагрузка на модель при обновлении будет сильно ниже, то формула целыми столбцами ворочает, а то только одной строкой.
Изменено: PooHkrd - 06.08.2018 15:17:58
Вот горшок пустой, он предмет простой...
 
Спасибо большое, то что нужно!
Изменено: vikttur - 24.06.2021 13:18:22
Страницы: 1
Наверх