Страницы: 1
RSS
PQ Получить номер месяца из его названия
 
Добрый день.
Мой вопрос состоит из нескольких этапов, но все они находятся в рамках одной темы.
1) Как вытащить номер месяца из названия месяца ( "Февраль",  2, и тд)
2) Месяца повторяются, как добавить к ним еще год(+1) в зависимости от того, сколько раз повторяется месяц.
Проштудировал всю страницу - https://docs.microsoft.com/ru-ru/powerquery-m/date-functions, но вот функции из текста в номер там не нашел.
Конечно, можно создать отдельную таблицу, где присвоить каждому месяцу соответствующий номер, но мне кажется это не совсем правильно.
Ну а про добавления года, я вообще не представления, как реализовать.
Буду благодарен за помощь.
 
Цитата
OblivionR написал:
из текста в номер там не нашел
А из текста в дату? А как же Date.FromText?
Код
Date.FromText("1 " & [столбец месяца] & " 2020","Ru-ru")
Цитата
OblivionR написал:
как добавить к ним еще год(+1)
а как понять к какому году они вообще изначально относятся? А по сути не так все просто в случае с PQ - подсчитать кол-во в зависимости от текущей строки
Изменено: Дмитрий(The_Prist) Щербаков - 29.02.2020 13:14:21
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, блин, я думал, по справке, что номер месяц в любом случае должен быть написан, числом(
Цитата
Дмитрий(The_Prist) Щербаков написал:
а как понять к какому году они вообще изначально относятся?
Извиняюсь, что не указал, любой год, например 2010 и тд. В итоге должно получиться 2010, 2011, ..., N в зависимости от повторений.
 
Так нужно?
Скрытый текст
Соблюдение правил форума не освобождает от модераторского произвола
 
вот это не поможет?
 
Еще вариант
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Артикул", type text}, {"Январь", Int64.Type}, {"Февраль", Int64.Type}, {"Март", Int64.Type}, {"Апрель", Int64.Type}, {"Май", Int64.Type}, {"Июнь", Int64.Type}, {"Июль", Int64.Type}, {"Август", Int64.Type}, {"Сентябрь", Int64.Type}, {"Октябрь", Int64.Type}, {"Ноябрь", Int64.Type}, {"Декабрь", Int64.Type}, {"Январь2", Int64.Type}, {"Февраль3", Int64.Type}, {"Март4", Int64.Type}, {"Апрель5", Int64.Type}, {"Май6", Int64.Type}, {"Июнь7", Int64.Type}, {"Июль8", Int64.Type}, {"Август9", Int64.Type}, {"Сентябрь10", Int64.Type}, {"Октябрь11", Int64.Type}, {"Ноябрь12", Int64.Type}, {"Декабрь13", Int64.Type}}),
    #"Другие столбцы с отмененным свертыванием" = Table.UnpivotOtherColumns(#"Измененный тип", {"Артикул"}, "Атрибут", "Значение"),
    #"Changed Type" = Table.TransformColumns(#"Другие столбцы с отмененным свертыванием",{{"Атрибут", each Text.Remove(_,{"0".."9"})}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Индекс", 0, 1),
    #"Grouped Rows" = Table.Group(#"Added Index", {"Атрибут"}, {{"a", each Table.AddIndexColumn(_, "Год", 1966), type table}}),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Grouped Rows", "a", {"Артикул", "Значение", "Индекс", "Год"}, {"Артикул", "Значение", "Индекс", "Год"}),
    #"Added Custom" = Table.AddColumn(#"Expanded {0}", "Пользовательская", each Text.From(Date.Month(Date.FromText("1 " & [Атрибут] & "2000","Ru-ru")))&"-"&Text.From([Год])),
    #"Sorted Rows" = Table.Sort(#"Added Custom",{{"Индекс", Order.Ascending}}),
    #"Removed Columns" = Table.RemoveColumns(#"Sorted Rows",{"Индекс", "Год"})
in
    #"Removed Columns"
 
Еще вариант запроса:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Артикул", type text}, {"Январь", Int64.Type}, {"Февраль", Int64.Type}, {"Март", Int64.Type}, {"Апрель", Int64.Type}, {"Май", Int64.Type}, {"Июнь", Int64.Type}, {"Июль", Int64.Type}, {"Август", Int64.Type}, {"Сентябрь", Int64.Type}, {"Октябрь", Int64.Type}, {"Ноябрь", Int64.Type}, {"Декабрь", Int64.Type}, {"Январь2", Int64.Type}, {"Февраль3", Int64.Type}, {"Март4", Int64.Type}, {"Апрель5", Int64.Type}, {"Май6", Int64.Type}, {"Июнь7", Int64.Type}, {"Июль8", Int64.Type}, {"Август9", Int64.Type}, {"Сентябрь10", Int64.Type}, {"Октябрь11", Int64.Type}, {"Ноябрь12", Int64.Type}, {"Декабрь13", Int64.Type}}),
    #"Другие столбцы с отмененным свертыванием" = Table.UnpivotOtherColumns(#"Измененный тип", {"Артикул"}, "Атрибут", "Значение"),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Другие столбцы с отмененным свертыванием",{{"Атрибут", type text}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип1", "Пользовательский", each Text.Remove([Атрибут],{"0".."9","."})),
    tbl = Table.AddIndexColumn(#"Добавлен пользовательский объект", "Индекс", 0, 1),
    count_m = 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) 
    ),
    month1 = Table.AddColumn(count_m, "Дата", each Date.FromText("1 " & [Пользовательский] & " " & Text.From(2020 + [счет месяцев]),"Ru-ru")),
    #"Удаленные столбцы" = Table.RemoveColumns(month1,{"Индекс", "счет месяцев"})
in
    #"Удаленные столбцы"
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
buchlotnik, да, то что нужно, спасибо!)
Буду знакомиться с другими вариантами форумчан.
 
Михаил Л, идею понял - добавить индекс от и до (задать конкретный год) внутри группировки. Но все равно получается накликать этот запрос не получится.
А вот запрос Дмитрий(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)

Надеюсь более-менее понятно пояснил.
Изменено: Дмитрий(The_Prist) Щербаков - 29.02.2020 14:17:57
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток
Цитата
Дмитрий(The_Prist) Щербаков написал:
Еще вариант запроса:
Ну, вы и садист :)  
Запрос на этом-то примерчике подтормаживает, а что будет, если столбцов будет этак штук сто, да и боюсь ТС не всё сказал, там и товаров может быть на сотню другую строк. Может же и не дождаться.
 
Цитата
Андрей VG написал:
Ну, вы и садист
канешна! мышкой-то каждый может наклацать  :D  А вообще List.Generate вроде достаточно шустро работает. Другой вопрос, что конечно, просматривать всю таблицу выше для каждой строки не есть хорошо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
просматривать всю таблицу выше для каждой строки не есть хорошо.
Ещё как не хорошо. Сделал 100 артикулов со случайными числами по месяцам. Подождал полторы минуты и прибил запрос :)  Не лучше ли сначала над шапкой заголовков так поиздеваться, создав таблицу сопоставления названию месяца в заголовке - дате с годом, а уж затем банально через Join связать с Unpivot таблицей?
 
Цитата
Месяца повторяются, как добавить к ним еще год(+1) в зависимости от того, сколько раз повторяется месяц

Обратите внимание , что при таком подсчете можете получить ошибку. Если к примеру в 2018 был май, в 2019 его не было, а в 2020 май опять появится то по вашему ТЗ получится 2019 год , а не 2020
 
Цитата
DrillPipe написал:
в 2019 его не было,
Коллега, по существующей структуре данных это может случиться только если для данного артикула отсутствуют данные для этого месяца. Из того факта, что  ТС не представил такого варианта, можно сделать вывод, что анализ реальных данных, проведённый ТС, не выявил такой проблемы. Ну, а если есть, то лучше применять преобразование месяцев и их суффиксных нумераций, анализируя шапку. Там же можно будет выяснить, что если в каком-то интервале январь1 - декабрь1 нет май1, то следующий май1 считать маем следующего года :)  
Но, чтобы делать заключения о том что есть нужно или обладать телепатическими способностями или получить информацию от ТС. Никакого отклика нет - следовательно и проблем нет.
Если вдруг выясниться, что майской зарплаты в этом году не будет, так как в результате вычислений выяснилось, что она была выплачена  в прошлом году, то ТС не виноват, ему гуру на форуме посоветовали так считать :)
 
Цитата
Андрей VG написал:
Если вдруг выясниться, что майской зарплаты в этом году не будет, так как в результате вычислений выяснилось, что она была выплачена  в прошлом году, то ТС не виноват, ему гуру на форуме посоветовали так считать
Коллеги, да вы не переживайте, просто не может не быть какого-то месяца, если продаж нет, то просто будет 0)))
Страницы: 1
Наверх