在具有更多列的新表中重组多行

时间:2019-04-04 13:14:48

标签: sql excel

我有一个看起来像这样的表:

+----------+----------+----------+----------+--------------------------+
| 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 :(得分:0)

这是我想出的一个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 forumla,它根据以下MATCH公式提供的行数和列数从补充范围($ A $ 2:$ E $ 5)提取数据。 / p>

当查找数组部分的结果等于1时,第一个MATCH提供行号。我正在检查两个条件,第一个是检查“俱乐部”名称{{1} },第二步是检查我们当前在($G2=$A$2:$A$5)上的哪个“角色”。这是使用((FLOOR((COLUMN() - COLUMN($H$1) ) / 3,1) + 1)函数将结果四舍五入为整数并除以列数(在这种情况下为3,即:姓名,姓氏和电子邮件)。

最后一个FLOOR将根据两个表中的标题名称提取列号。如果您想将更改的角色名称合并到列标题中,则可以将此部分更改为类似以下内容:

MATCH

由于在表1中选择了原始范围,因此我在mod的末尾添加了3。我们要提取的列从范围中的位置3开始。

答案 1 :(得分:0)

如果要在Oracle Sql中执行此操作,则在分析sql中有一个不错的方法。 要将行转换/交换为列或将列转换为行,我们可以使用Pivot或Unpivot运算符。 在您的示例中,使用以下查询根据需要隐藏数据

Result = array of size nb_objects, initialized with empty sets
for i from 0 to total_nb_of_objects:
    for each feasible solution 'new_solution' to the problem with fixed number of objects:
        for each solution of Result[i]:
            if hours(new_solution) >= hours(solution) and  \
               cost(new_solution) >= cost(solution) and    \
               people(new_solution) >= people(solution):
                dominated = true
                break
        if not dominated:
            add new_solution to Result[i]
return Result