Реорганизовать несколько строк в новой таблице с большим количеством столбцов - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть таблица, которая выглядит так:

+----------+----------+----------+----------+--------------------------+
| Club     | Role     | Name     | Lastname | Email                    |
+----------+----------+----------+----------+--------------------------+
| Porto    | 1        | Peter    | Pan      | peter.pan@mail.com       | 
| Porto    | 2        | Michelle | Obama    | michelle.obama@mail.com  |
| Monaco   | 1        | Serena   | Williams | serena.williams@mail.com |
| Monaco   | 2        | David    | Beckham  | david.beckham@mail.com   |
+----------+----------+----------+----------+--------------------------+

и я хочу получить такую ​​таблицу:

+----------+-----------------+-----------------+---------------------------------+-----------------+-----------------+---------------------------------+
| Club     | Role 1 Name     | Role 1 Lastname | Role 1 Email                    | Role 2 Name     | Role 2 Lastname | Role 2 Email                    |
+----------+-----------------+-----------------+---------------------------------+-----------------+-----------------+---------------------------------+
| Porto    | Peter           | Pan             | peter.pan@mail.com              | Michelle        | Obama           | michelle.obama@mail.com         |
| Monaco   | Serena          | Williams        | serena.williams@mail.com        | David           | Beckham         | david.beckham@mail.com          |
+----------+-----------------+-----------------+---------------------------------+-----------------+-----------------+---------------------------------+

, где люди с разными ролями в каждом клубе ставят в один ряд.

В идеале я хотел бы найти способ сделать это в Excel, но я не уверен, возможно ли это. Если нет, то код SQL также очень поможет.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Если вы хотите сделать это в Oracle Sql, есть хороший подход в аналитическом sql. Чтобы преобразовать / поменять строки в столбцы или столбцы в строки, мы можем использовать операторы Pivot или Unpivot. В вашем примере используйте приведенный ниже запрос, чтобы скрыть данные, как вам нравится,

select * from 
(
with all_roles as
(select 1 role from dual union all
select 2 role from dual),
ddata as
(select 1 c_role, 'porto' club, 'peter' fname,'pan' lname,'peter.pan@mail.com' email from dual union all
select 2 c_role, 'porto' club, 'Michelle' fname, 'Obama' lname,'michelle.obama@mail.com' email  from dual union all
select 1 c_role, 'monaco' club, 'Serena' fname, 'Williams' lname,'serena.williams@mail.com'  email from dual union all
select 2 c_role, 'monaco' club, 'David' fname, 'Beckham' lname,'david.beckham@mail.com'  email from dual ) 
(select role, club, fname,lname, email from ddata,all_roles
where all_roles.role=ddata.c_role)) all_data
pivot ( 
  max(fname) fname,
  max(lname) lname,
  max(email) email
  for role in ( 1 role1, 2 role2 )
)
order by club;
0 голосов
/ 04 апреля 2019

Вот то, что я мог бы придумать для формулы Excel.Надеюсь, это может подтолкнуть вас в правильном направлении.

Эта формула предполагает, что ваша первая таблица существует в диапазоне A1: E5, а вторая таблица существует в диапазоне G1: M3.Также предполагается, что имена столбцов второй таблицы просто повторяются без номера роли, прикрепленной к передней части (так же, как первая таблица).Эта формула является формулой массива, поэтому вы должны убедиться, что при ее вводе выполните CTRL + SHIFT + ENTER.

{=INDEX($A$2:$E$5,
  MATCH(1,($G2=$A$2:$A$5)*((FLOOR((COLUMN() - COLUMN($H$1) ) / 3,1) + 1)=$B$2:$B$5),0),
  MATCH(H$1,$A$1:$E$1,0))}

Первая часть использует форум INDEX, который извлекает данные из диапазона, указанного выше.($ A $ 2: $ E $ 5) на основе номеров строк и столбцов, предоставленных следующими формулами MATCH.

Первый MATCH предоставляет номер строки для результата, указанного в разделе массива поискаравно 1. Я проверяю два условия: первое - проверить имя «Клуба» ($G2=$A$2:$A$5), а второе - проверить, для какой «Роли» мы находимся в данный момент ((FLOOR((COLUMN() - COLUMN($H$1) ) / 3,1) + 1).При этом используется функция FLOOR для округления результата до целого числа и деления на количество столбцов (в нашем случае это 3: имя, фамилия и адрес электронной почты).

Конечный MATCH - этовытащить номер столбца на основе имен заголовков из обеих таблиц.Если вы хотите включить изменяющиеся имена ролей в заголовки столбцов, вы можете изменить эту часть на что-то вроде этого:

 {=INDEX($A$2:$E$5,
  MATCH(1,($G2=$A$2:$A$5)*((FLOOR((COLUMN() - COLUMN($H$1) ) / 3,1) + 1)=$B$2:$B$5),0),
  MOD(COLUMN() - COLUMN($H$1),3) + 3)}

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

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