Как объединить строки данных в Excel - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь объединить строки, когда они имеют одинаковый идентификатор, порядок и класс. Однако консолидированная строка должна суммировать длину и вводить правильное начало и конец. Таким образом, объединенная строка будет иметь начальное значение первой строки и конечное значение последней строки. Пожалуйста, проверьте изображение, чтобы понять, что я имею в виду.

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

Возможно ли это с помощью Excel? Я не могу использовать сводные таблицы, потому что я не просто пытаюсь суммировать длину, я хочу, чтобы столбцы остались прежними, просто чтобы соответствующим образом объединить строки. Буду признателен за любую помощь!

Левое - это то, что у меня есть, правое - то, чего я пытаюсь достичь: enter image description here

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Опция с формулами - проще всего скопировать таблицу в новое место и использовать Remove duplicates, чтобы оставить уникальные значения в столбцах Id, Order и Class. Затем заполните столбцы следующими формулами:

Начало (формула массива):

{=INDEX($C$2:$C$9,MIN(IF(($A$2:$A$9=H2)*($B$2:$B$9=I2)*($F$2:$F$9=M2),ROW($A$2:$A$9)-MIN(ROW($A$2:$A$9))+1)),0)}

Конец ( формула массива):

{=INDEX($D$2:$D$9,MAX(IF(($A$2:$A$9=H2)*($B$2:$B$9=I2)*($F$2:$F$9=M2),ROW($A$2:$A$9)-MIN(ROW($A$2:$A$9))+1)),0)}

Длина (обычная формула):

=SUMPRODUCT($E$2:$E$9*($A$2:$A$9=H2)*($B$2:$B$9=I2)*($F$2:$F$9=M2))

Массив формул после редактирования подтверждается нажатием ctrl + shift + enter

enter image description here

0 голосов
/ 22 января 2020

В вашем примере кажется, что вы хотите begin и end соответственно min и max, и я использовал это в подходе.

Относительно просто сделать с Power Query, доступный в Excel 2010 +.

  • Выберите столбцы ID, Порядка и Класса
  • Group By
    • Для агрегаций есть min начала; максимум конца; и сумма длины
  • Переместить столбец класса обратно в конец

Вуаля!

enter image description here

Все это можно быстро сделать из пользовательского интерфейса

M-код

let
    Source = Excel.CurrentWorkbook(){[Name="Table7"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Order", Int64.Type}, {"begin", Int64.Type}, {"end", Int64.Type}, {"length", Int64.Type}, {"class", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"ID", "Order", "class"}, {{"Begin", each List.Min([begin]), type number}, {"End", each List.Max([end]), type number}, {"Length", each List.Sum([length]), type number}}),
    #"Reordered Columns" = Table.ReorderColumns(#"Grouped Rows",{"ID", "Order", "Begin", "End", "Length", "class"})
in
    #"Reordered Columns"

Для полноты: если, Возможно, вам действительно нужно использовать первую и последнюю строки в каждой группе для Begin и End, вместо Min/Max, вы можете использовать следующий код.

На шаге group by, вместо агрегирования начала / конца по макс / мин, вы выбираете агрегацию All Rows. Это создаст таблицу, которая включает начальную и конечную записи для каждой группы. Затем вы можете извлечь первую и последнюю записи, используя функции List.First и List.Last.

Код для пользовательских столбцов:

List.First(Table.Column([#"Start/End"],"begin"))
List.Last(Table.Column([#"Start/End"],"end"))

M-Code

let
    Source = Excel.CurrentWorkbook(){[Name="Table7"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Order", Int64.Type}, {"begin", Int64.Type}, {"end", Int64.Type}, {"length", Int64.Type}, {"class", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"ID", "Order", "class"}, {{"Length", each List.Sum([length]), type number}, {"Start/End", each _, type table [ID=number, Order=number, begin=number, end=number, length=number, class=number]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Begin", each List.First(Table.Column([#"Start/End"],"begin"))),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "End", each List.Last(Table.Column([#"Start/End"],"end"))),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Start/End"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"ID", "Order", "Begin", "End", "Length", "class"})
in
    #"Reordered Columns"

Кстати, вы можете довольно близко подойти к обычной сводной таблице (особенно если вы можете использовать Min / Max для начала / конца). Это не так гибко, и я не думаю, что вы можете упорядочить столбцы так, как вы показали.

Ниже приведена простая сводная таблица.

Вы перетаскиваете ID, Порядок и класс в область рядов. Вы перетаскиваете «Начало», «Конец» и «Длина» в область «Значения», применяя «Мин.», «Макс.» И «Сумма».

Затем отобразите макет в табличной форме; отключите общие итоги и промежуточные итоги, и вы получите:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...