Страницы: 1
RSS
Из плоской в кросс таблицу(PQ), Expression.Error: Элементов в перечислении было слишком много для выполнения операции. Сведения: List
 
Приветствую!
Столкнулся с тем, что нужно из плоской таблицы сделать кросс таблицу. Решил попробовать через PQ, но столкнулся с ошибкой.

Код:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"ФИО", type text}, {"Параметр", type text}}),
    #"Сведенный столбец" = Table.Pivot(#"Измененный тип", List.Distinct(#"Измененный тип"[Параметр]), "Параметр", "ФИО")
in
    #"Сведенный столбец"

Скрытый текст

В чем может быть причина ?

Пробовал иначе сделать, но зашел в тупик:

Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"ФИО", type text}, {"Параметр", type text}}),
    #"Сведенный столбец" = Table.Pivot(#"Измененный тип", List.Distinct(#"Измененный тип"[ФИО]), "ФИО", "Параметр"),
    #"Пониженные заголовки" = Table.DemoteHeaders(#"Сведенный столбец"),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Пониженные заголовки",{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}, {"Column10", type text}, {"Column11", type text}, {"Column12", type text}, {"Column13", type text}, {"Column14", type text}, {"Column15", type text}, {"Column16", type text}, {"Column17", type text}, {"Column18", type text}, {"Column19", type text}, {"Column20", type text}, {"Column21", type text}, {"Column22", type text}}),
    #"Обращенные строки" = Table.ReverseRows(#"Измененный тип1"),
    #"Повышенные заголовки" = Table.PromoteHeaders(#"Обращенные строки", [PromoteAllScalars=true]),
    #"Измененный тип2" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Коммерческий директор", type text}, {"Экономисты", type text}, {"Руководитель группы торгового маркетинга", type text}, {"Трейд маркетолог", type text}, {"Дивизиональный менеджер", type text}, {"Дивизиональный менеджер_1", type text}, {"Дивизиональный менеджер_2", type text}, {"Трейд маркетолог_3", type text}, {"Трейд маркетолог_4", type text}, {"Pегиональный менеджер", type text}, {"Pегиональный менеджер_5", type text}, {"Pегиональный менеджер_6", type text}, {"Дивизиональный менеджер_7", type text}, {"Дивизиональный менеджер_8", type text}, {"Pегиональный менеджер_9", type text}, {"Pегиональный менеджер_10", type text}, {"РКАМ или ТМ или Сити", type text}, {"РКАМ или ТМ или Сити_11", type text}, {"РКАМ или ТМ или Сити_12", type text}, {"Директор по продажам", type text}, {"РКАМ или ТМ или Сити_13", type text}, {"РКАМ или ТМ или Сити_14", type text}})
in
    #"Измененный тип2"



Пример прилагаю, с тем что есть и что необходимо получить.

Спасибо!
 
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"ФИО", type text}, {"Параметр", type text}}),
    #"Сгруппированные строки" = Table.Group(#"Измененный тип", {"Параметр"}, {{"rows", each _, type table [ФИО=text, Параметр=text]}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Сгруппированные строки", "all_fil", each Text.Combine([rows][ФИО],";")),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Добавлен пользовательский объект",{"rows"}),
    #"Разделить столбец по разделителю" = Table.SplitColumn(#"Удаленные столбцы", "all_fil", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"all_fil.1", "all_fil.2", "all_fil.3", "all_fil.4", "all_fil.5"}),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Разделить столбец по разделителю",{{"all_fil.1", type text}, {"all_fil.2", type text}, {"all_fil.3", type text}, {"all_fil.4", type text}, {"all_fil.5", type text}}),
    #"Транспонированная таблица" = Table.Transpose(#"Измененный тип1"),
    #"Повышенные заголовки" = Table.PromoteHeaders(#"Транспонированная таблица", [PromoteAllScalars=true]),
    #"Измененный тип2" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Коммерческий директор", type text}, {"Экономисты", type text}, {"Руководитель группы торгового маркетинга", type text}, {"Трейд маркетолог", type text}, {"Дивизиональный менеджер", type text}, {"Pегиональный менеджер", type text}, {"РКАМ или ТМ или Сити", type text}, {"Директор по продажам", type text}})
in
    #"Измененный тип2"
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, Когда знаешь, все просто! Спасибо большое!)
 
Вариант:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    GroupedRows = Table.Group(Source, {"Параметр"}, {{"таб", each Table.AddIndexColumn(_, "И", 0, 1), type table}}),
    Combine = Table.Combine( GroupedRows[таб] ),
    PivotedColumn = Table.RemoveColumns( Table.Pivot(Combine, List.Distinct(Combine[Параметр]), "Параметр", "ФИО"), {"И"} )
in
    PivotedColumn

И еще до кучи
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    GroupedRows = Table.Group(Source, {"Параметр"}, {{"таб", each _[ФИО], type list}}),
    Table = Table.FromColumns( GroupedRows[таб], GroupedRows[Параметр] )
in
    Table
Изменено: PooHkrd - 14.02.2020 16:07:40
Вот горшок пустой, он предмет простой...
 
PooHkrd, Спасибо! Буду изучать) Возможно это поможет решить общую задачу, состоящую из ряда вопросов, включая этот)))
 
Кстати, для этого конкретного случая можно совместить мышкоклацанье с небольшим вмешательством в код ручками. Т.к. в текущем варианте есть существенный недостаток: если макс.кол-во фамилий где-то будет больше 5 - они уже не попадут в итоговую таблицу, т.к. они жестко заданы здесь:
Код
Table.SplitColumn(#"Удаленные столбцы", "all_fil", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"all_fil.1", "all_fil.2", "all_fil.3", "all_fil.4", "all_fil.5"}),
Поэтому такие вещи в любом случае надо как-то обходить(оптимально - как показал PooHkrd, но для начинающих не всегда удобно это читать, ибо не всегда понятно что там вообще накидали :)). Поэтому вариант попроще для понимания и разбора по шагам:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"ФИО", type text}, {"Параметр", type text}}),
    #"Сгруппированные строки" = Table.Group(#"Измененный тип", {"Параметр"}, {{"rows", each _, type table [ФИО=text, Параметр=text]}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Сгруппированные строки", "all_fil", each Text.Combine([rows][ФИО],";")),
    addmax_col = Table.AddColumn(#"Добавлен пользовательский объект", "max_cols", each Text.Length([all_fil])-Text.Length(Text.Remove([all_fil],";"))),
    max_col_cnt = List.Max(addmax_col[max_cols])+1,
    new_cols = List.Transform({1..max_col_cnt}, each Number.ToText(_)),
    #"Удаленные столбцы" = Table.RemoveColumns(addmax_col,{"rows","max_cols"}),
    #"Разделить столбец по разделителю" = Table.SplitColumn(#"Удаленные столбцы", "all_fil", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv),new_cols),
    #"Транспонированная таблица" = Table.Transpose(#"Разделить столбец по разделителю"),
    #"Повышенные заголовки" = Table.PromoteHeaders(#"Транспонированная таблица", [PromoteAllScalars=true])
in
    #"Повышенные заголовки"
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, Да, на самом деле фамилий куда больше 5)) Спасибо!) Разобрал код Вашего запроса, понял что к чему. но попробовал добавить пару фамилий в таблицу и при этом оставив штатное разделение по разделителю, и фамилии попали в итоговую. В каком случаи они все таки потеряются?(пытаюсь понять что отлавливает эта часть кода:
Код
    addmax_col = Table.AddColumn(#"Добавлен пользовательский объект", "max_cols", each Text.Length([all_fil])-Text.Length(Text.Remove([all_fil],";"))),    max_col_cnt = List.Max(addmax_col[max_cols])+1,
    new_cols = List.Transform({1..max_col_cnt}, each Number.ToText(_)),
Как эта часть кода работает понял) а вот для чего, не совсем.  Спасибо!
Изменено: Xat - 17.02.2020 14:33:42
 
Цитата
PooHkrd написал:
И еще до кучи
Код становится все короче и короче)) Спасибо!!(применил но не понял))
Изменено: Xat - 17.02.2020 14:35:06
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
но для начинающих не всегда удобно это читать, ибо не всегда понятно что там вообще накидали
написал Дмитрий и сам накидал непонятного.  :D
Xat, когда вы жмете кнопку Разделить столбец по разделителю, то формируется шаг с функцией
Код
Table.SplitColumn(table as table, sourceColumn as text, splitter as function, optional columnNamesOrNumber as any, optional default as any, optional extraColumns as any)

четвертым аргументом которой является список имен столбцов, которые должны получиться в итоге. При использовании кнопочного интерфейса создается шаг, в котором эти наименования столбцов "прибиты гвозядми" в коде, т.е. в случае получения результата с другим количеством столбцов, результат будет всегда одним и тем же. Именно об этом и написал в своем предыдущем посте. Этим кодом он определяет количество будущих столбцов, формирует список их наименований и подсовывает в упомянутую ранее функцию. Сделал предложенный код универсальным.
Если уж мои предыдущие решения не устраивают, то предлагаю полностью кнопочное без тех изысков, которые предложил ранее Дмитрий. Ручками прописывалась только функция в 4 строке кода, Ну так там она всегда пишется ручками.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Grouped Rows" = Table.Group(Источник, {"Параметр"}, {{"таб", each _, type table}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Пользовательская", each Table.AddIndexColumn([таб], "Индекс", 0, 1)),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Added Custom", "Пользовательская", {"ФИО", "Индекс"}, {"ФИО", "Индекс"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded {0}",{"таб"}),
    #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Параметр]), "Параметр", "ФИО"),
    #"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Индекс"})
in
    #"Removed Columns1"

Цитата
Xat написал:
Код становится все короче и короче
В данном случае не только короче, но и производительнее. Так формировать таблицы это самый ресурсоэкономичный вариант.
Цитата
Xat написал:
Спасибо!!(применил но не понял))
Что именно не понятно? Вы не стесняйтесь - спрашивайте.
Изменено: PooHkrd - 17.02.2020 15:00:39
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх