Добрый день. Мой вопрос состоит из нескольких этапов, но все они находятся в рамках одной темы. 1) Как вытащить номер месяца из названия месяца ( "Февраль", 2, и тд) 2) Месяца повторяются, как добавить к ним еще год(+1) в зависимости от того, сколько раз повторяется месяц. Проштудировал всю страницу - https://docs.microsoft.com/ru-ru/powerquery-m/date-functions, но вот функции из текста в номер там не нашел. Конечно, можно создать отдельную таблицу, где присвоить каждому месяцу соответствующий номер, но мне кажется это не совсем правильно. Ну а про добавления года, я вообще не представления, как реализовать. Буду благодарен за помощь.
а как понять к какому году они вообще изначально относятся? А по сути не так все просто в случае с PQ - подсчитать кол-во в зависимости от текущей строки
let
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
unpiv = Table.UnpivotOtherColumns(from, {"Артикул"}, "Атрибут", "Значение"),
month = Table.AddColumn(unpiv, "month", each Text.Remove([Атрибут],{"0".."9","."})),
fn = (tbl)=>
let
a = Table.AddIndexColumn(tbl, "year", 2010, 1)[[Артикул],[Значение],[month],[year]],
b = Table.AddColumn(a,"Дата", each Date.From([month] & " " & Text.From([year])))[[Артикул],[Значение],[Дата]]
in
b,
group = Table.Combine(Table.Group(month, "month", {"tmp", each fn(_)})[tmp]),
to = Table.Sort(group,{{"Дата", Order.Ascending}})
in
to
Михаил Л, идею понял - добавить индекс от и до (задать конкретный год) внутри группировки. Но все равно получается накликать этот запрос не получится. А вот запрос Дмитрий(The_Prist) Щербаков - получится, правда конструкция ниже мне не понятна.
Код
Table.AddColumn(tbl, "счет месяцев", each
let
value = [Пользовательский],
indx = [Индекс],
calc = List.Generate(
()=> [i = 0, a = 0],
each [i] <= indx,
each [i = [i] + 1, a = (if tbl[Пользовательский]{[i]} = value then 1 else 0)],
each [a]
)
in
List.Sum(calc)
)
OblivionR написал: правда конструкция ниже мне не понятна
если вкратце: List.Generate создает новый список для каждого месяца с записью 1 там, где этот месяц встречается. При этом используя: входные значения: value = [Пользовательский] - имя месяца, indx = [Индекс] - значение из столбца индекса для определения текущей строки стартовые значения цикла: [i = 0, a = 0], где i - текущий счетчик строк(0 - начинать с самой первой строки таблицы), а - подсчет одинаковых месяцев, на основании value условие, когда цикл надо завершить: each [i] <= indx - т.е. только до тех пор, пока мы считываем значения выше текущей строки или равные ей непосредственно функция, которая и считает кол-во повторяющихся месяцев: each [i = [i] + 1, a = (if tbl[Пользовательский]{[i]} = value then 1 else 0)] - увеличиваем счетчик; проверяем - если значение месяца проверяемой строки(tbl[Пользовательский]{[i]}) равно текущему значению value, то пишем в новый список 1, в противном случае 0. Ну а т.к. List.Generate, исходя из названия создает объект список, то завершаем все преобразованием в единое значение путем List.Sum, т.е. суммирования всех значений созданного списка. Так и получаем кол-во месяцев, аналогично функции СЧЁТЕСЛИ в Excel с незакрепленной второй ссылкой: СЧЁТЕСЛИ(A$1:A10;A10)
Ну, вы и садист Запрос на этом-то примерчике подтормаживает, а что будет, если столбцов будет этак штук сто, да и боюсь ТС не всё сказал, там и товаров может быть на сотню другую строк. Может же и не дождаться.
канешна! мышкой-то каждый может наклацать А вообще List.Generate вроде достаточно шустро работает. Другой вопрос, что конечно, просматривать всю таблицу выше для каждой строки не есть хорошо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Ещё как не хорошо. Сделал 100 артикулов со случайными числами по месяцам. Подождал полторы минуты и прибил запрос Не лучше ли сначала над шапкой заголовков так поиздеваться, создав таблицу сопоставления названию месяца в заголовке - дате с годом, а уж затем банально через Join связать с Unpivot таблицей?
Месяца повторяются, как добавить к ним еще год(+1) в зависимости от того, сколько раз повторяется месяц
Обратите внимание , что при таком подсчете можете получить ошибку. Если к примеру в 2018 был май, в 2019 его не было, а в 2020 май опять появится то по вашему ТЗ получится 2019 год , а не 2020
Коллега, по существующей структуре данных это может случиться только если для данного артикула отсутствуют данные для этого месяца. Из того факта, что ТС не представил такого варианта, можно сделать вывод, что анализ реальных данных, проведённый ТС, не выявил такой проблемы. Ну, а если есть, то лучше применять преобразование месяцев и их суффиксных нумераций, анализируя шапку. Там же можно будет выяснить, что если в каком-то интервале январь1 - декабрь1 нет май1, то следующий май1 считать маем следующего года Но, чтобы делать заключения о том что есть нужно или обладать телепатическими способностями или получить информацию от ТС. Никакого отклика нет - следовательно и проблем нет. Если вдруг выясниться, что майской зарплаты в этом году не будет, так как в результате вычислений выяснилось, что она была выплачена в прошлом году, то ТС не виноват, ему гуру на форуме посоветовали так считать
Андрей VG написал: Если вдруг выясниться, что майской зарплаты в этом году не будет, так как в результате вычислений выяснилось, что она была выплачена в прошлом году, то ТС не виноват, ему гуру на форуме посоветовали так считать
Коллеги, да вы не переживайте, просто не может не быть какого-то месяца, если продаж нет, то просто будет 0)))