Страницы: 1
RSS
Объединенить данные одинаковых строк по дате производства авто
 
Приветствую.
Задача может дико звучать но уверен что пример поможет понять.
Передо мной стоит задача, взять таблицу данных автомобилей, в которой много одинаковых строк (кроме года производства) и в таблице результата сразу несколько одинаковых строк (кроме года) соединить в диапазон, так как в примере ниже:
Вот это:
Year Make and modelTrim Engine
2011 BMW 135i Base 3.0L L6 - Gas
2012 BMW 135i Base 3.0L L6 - Gas
2013 BMW 135i Base 3.0L L6 - Gas
2013 BMW 135is Base 3.0L L6 - Gas
2014 BMW 228i Base 2.0L L4 - Gas
2015 BMW 228i Base 2.0L L4 - Gas
2016 BMW 228i Base 2.0L L4 - Gas
2015 BMW 228i xDrive Base 2.0L L4 - Gas
превратить вот в это:
2011-2013BMW 135iBase3.0L L6 - Gas
2013BMW 135isBase3.0L L6 - Gas
2014-2016BMW 228iBase2.0L L4 - Gas
2015BMW 228i xDriveBase2.0L L4 - Gas
Объединить значения ячейки я умею:
Код
=A9&"-"&A11

проблема в том что значения в первую таблицу попадают копированием (Ctrl+C, Ctrl+V) большого куска данных постоянно, и наперед знать в какой ячейке будет стоять другая модель или мотор - я не могу. То есть по факту исходные данные изменяются динамически, и привязка формул к абсолютным координатам невозможна.
Предположительно нужно в отдельной колонке к первой таблице сделать расчет сколько еще повторяющихся значений ждет в следующих строках, возможно с помощью функции ПОИСКПОЗ,

Вопрос к форумчанам: как решить эту задачу?
Буду рад любым грамотным предложениям.

p.s: у меня Microsoft Office Professional Plus 2019. версия английская, добавил файл примера.
 
Александр Зинковский, если "разрывов" в годах нет, то просто:
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content], 
  group = Table.Group (
    src, 
    { "Make", "Body & Trim", "Engine & Transmission" }, 
    {
      {
        "range:", 
        each 
          if List.Min ( [YEAR] ) = List.Max ( [YEAR] ) then
            Text.From ( List.Min ( [YEAR] ) )
          else
            Text.From ( List.Min ( [YEAR] ) ) & " - " & Text.From ( List.Max ( [YEAR] ) )
      }
    }
  ), 
  reorder = Table.ReorderColumns ( group, { "range:", "Make", "Body & Trim", "Engine & Transmission" } )
in
  reorder
Изменено: surkenny - 25.10.2021 06:57:18
 
Оказывается "разрывы" в периоде выпуска есть: BMW 750Li Base 4.4L V8 - Gas. Кстати, есть дубль строки (выделил красным в начальной таблице). Тогда посложнее:
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
  distinctValues = Table.Distinct ( src ),
  group = Table.Group (
    distinctValues,
    { "Make", "Body & Trim", "Engine & Transmission" },
    {
      {
        "range:",
        each [
          items = List.Buffer ( List.Sort ( [YEAR] ) ),
          count = List.Count ( items ),
          generate = List.Generate (
            () => [ i = 0, YEAR = items{i}, rangeNum = 1 ],
            each [i] < count,
            each [
              i        = [i] + 1, 
              rangeNum = if items{i} = [YEAR] + 1 then [rangeNum] else [rangeNum] + 1, 
              YEAR     = items{i}
            ],
            each [[YEAR], [rangeNum]]
          ),
          toTbl = Table.FromRecords ( generate, { "YEAR", "rangeNum" } ),
          group = Table.Group (
            toTbl,
            { "rangeNum" },
            {
              {
                "range",
                each
                  if List.Min ( [YEAR] ) = List.Max ( [YEAR] ) then
                    Text.From ( List.Min ( [YEAR] ) )
                  else
                    Text.From ( List.Min ( [YEAR] ) ) & " - " & Text.From ( List.Max ( [YEAR] ) )
              }
            }
          )
        ][group][range]
      }
    }
  ),
  reorder = Table.ReorderColumns ( group, { "range:", "Make", "Body & Trim", "Engine & Transmission" } ),
  expandRange = Table.ExpandListColumn ( reorder, "range:" )
in
  expandRange
 
Цитата
surkenny написал: Оказывается "разрывы" в периоде выпуска есть: BMW 750Li Base 4.4L V8 - Gas. Кстати, есть дубль строки (выделил красным в начальной таблице)
Приветствую.
Большое спасибо за инициативу, помощь мне однозначно нужна, и по содержанию можно понять что отвечает опытный человек.

Однако, поскольку, как я понял нужно будет делать запрос power query - мне показалось это трудным, в идеале запихнуть весь код в макрос (добавил фото), но к сожалению  Microsoft Visual Basic for Applications -не понимает что я от него хочу и ломается на первой же строке let.

Есть ли альтернатива вашему методу?
Спасибо!

P.s.: человек что будет с программой работать - вообще считает всех кто знает Ctrl+C, Ctrl+V программистами, нужно немного упростить работу.
 
Александр Зинковский,
1. такая цитата, которую вы сделали никому не нужна. Лучше просто нажимайте кнопку "Имя", а не "Цитировать"
2. Макросы VBA  - это одно, а код на языке "М" для Power Query - это другое. Так не заработает.
 
Цитата
New написал: код на языке "М" для Power Query
Хорошо, я уже вроде как разобрался в нем, спасибо. Кстати говоря похоже мне этот продукт подойдет для запросов в большой датабазе (более 200 тысяч строк) при этом не выводя все на экран.

Цитата
surkenny: если "разрывов" в годах нет...
Спасибо, Ваш код на "М" для Power Query мне помог. Осталось разобраться в переменных на случай если надо будет что-то подкорректировать.
Тему можно закрывать.  
 
Цитата
в таблице результата сразу несколько одинаковых строк (кроме года) соединить в диапазон
У меня получилось 134 строки, а у вас 138 ?
Страницы: 1
Наверх