Превратите строки Excel в столбцы - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно переформатировать мои данные.

Прямо сейчас это выглядит примерно так

PersonCol   DataCol
Person1     Data1
Person1     Data2
Person1     Data3
Person2     Data4
Person2     Data5
Person2     Data6
Person3     Data7

И мне нужно повернуть его, чтобы он выглядел следующим образом. Мне нужно превратить первую строку в имена столбцов, и все связанные с ними данные отображаются в виде списков ниже.

Person1       Person2       Person3
Data 1        Data4         Data7
Data2         Data5
Data3         Data6

Я пытался использовать функцию TRANSPOSE, но это не сработало так, как мне было нужно.

Я бы сделал это вручную. Однако список должен автоматически обновляться

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Вы можете сделать это с помощью Power Query (он же Get & Transform в Excel 2016+). И если ваши исходные данные изменятся, вы можете обновить запрос.

  • Выберите ячейку в таблице
  • (в Excel 2016): лента данных, вкладка «Получить и преобразовать» из таблицы / диапазона
  • В пользовательском интерфейсе PQ: группировка по PersonCol Операция: = All Rows
  • Добавить столбец; Пользовательская колонка; формула: =Table.Column([Grouped],"DataCol")
  • Выберите двуглавую стрелку справа от заголовка столбца Custom.
    • Извлечение значений
    • Я использовал точку с запятой в качестве разделителя, используйте то, что не отображается в данных
  • Разделить столбец по разделителю (точка с запятой) -> Данные в новых столбцах
  • Удалите столбец таблиц, где вы ранее группировали данные
  • Транспонировать стол
  • Повышение первого ряда до заголовков
  • Закрыть и загрузить туда, куда вы хотите

M-код

let
    Source = Excel.CurrentWorkbook(){[Name="Table4"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"PersonCol", type text}, {"DataCol", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonCol"}, {{"Grouped", each _, type table [PersonCol=text, DataCol=text]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.Column([Grouped],"DataCol")),
    #"Extracted Values" = Table.TransformColumns(#"Added Custom", {"Custom", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values", "Custom", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"Custom.1", "Custom.2", "Custom.3"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Custom.1", type text}, {"Custom.2", type text}, {"Custom.3", type text}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type1",{"Grouped"}),
    #"Transposed Table" = Table.Transpose(#"Removed Columns"),
    #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true]),
    #"Changed Type2" = Table.TransformColumnTypes(#"Promoted Headers",{{"Person1", type text}, {"Person2", type text}, {"Person3", type text}})
in
    #"Changed Type2"

Результаты

enter image description here

0 голосов
/ 21 мая 2019

Структура данных, которую вы предлагаете, не имеет смысла с точки зрения базы данных / , потому что она не может правильно отображать данные, если она имеет более одного вхождения данных на человека.

Самая простая и логичная структура - создать сводную таблицу следующим образом:

enter image description here

Где подсчет Данных на человека будет считаться правильно даже при множественных встречах.

Другой вариант - заменить дубликаты и использовать =COUNTIF()


РЕДАКТИРОВАТЬ: Я думаю, если бы вы действительно хотели, вы могли бы использовать что-то вроде этого, но я бы не рекомендовал это. Сводная таблица отлично работает

enter image description here

Формула для Data1 будет выглядеть так:

=IFNA(INDEX(D4:E$10, MATCH(1, E4:$E$10, 0),1), "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...