从多列创建值列表
Create list of values from multiple columns
数据库
| A | B | C | D |
---|-----------|--------------------|------------------|------------------|---
1 | Flight | Crew Member 1 | Crew Member 2 | Crew Member 3 |
2 | F001 | Michael | Katrin | Karl |
3 | F002 | Jennifer | Peter | Karl |
4 | F003 | Peter | | |
5 | F004 | Karl | Michael | |
6 | F005 | Jennifer | Michael | Katrin |
7 | F006 | Peter | Karl | Michael |
8 | F007 | Karl | Jennifer | |
注:
- table 中的每个名称都是唯一的。
- 每个名字每行只能出现一次。
预期结果
| E | F |
---|---------------|--------------------|--
1 | Name | Flights |
2 | Jennifer | F002 |
3 | Jennifer | F005 |
4 | Jennifer | F007 |
5 | Katrin | F001 |
6 | Katrin | F005 |
7 | Karl | F001 |
8 | Karl | F002 |
9 | Karl | F004 |
10 | Karl | F006 |
11 | Karl | F007 |
12 | Michael | F001 |
13 | Michael | F004 |
14 | Michael | F005 |
15 | Michael | F006 |
16 | Peter | F002 |
17 | Peter | F003 |
18 | Peter | F006 |
如您在 data-base
中所见,有一个包含多个航班的列表。
在 Columns B:D
中显示每个航班的机组人员。
现在我想列出每个机组成员的所有航班。
因此,我想知道我需要什么公式
a)根据在Column B:D
中出现的次数列出Column E
中的所有剧组成员
b) 在 Column F
中将每个航班分配给他们
你知道如何解决这个问题吗?
在这种情况下,我会选择 PowerQuery。
- 步骤 1) - Select 您的 table 并将其加载到 PowerQuery 中。
- 第 2 步) - Select 'Flight' 列和逆透视其余部分。
- 步骤 3) - 删除包含 Crewmembers 的列。
- 步骤 4) - 对 'Value' 列进行升序排序并过滤掉空行。
确实只需点击几下,但下面是 M-code 助您一臂之力:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Flight", type text}, {"Crew Member 1", type text}, {"Crew Member 2", type text}, {"Crew Member 3", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Flight"}, "Attribute", "Value"),
#"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute"}),
#"Filtered Rows" = Table.SelectRows(#"Removed Columns", each [Value] <> null and [Value] <> ""),
#"Sorted Rows" = Table.Sort(#"Filtered Rows",{{"Value", Order.Ascending}})
in
#"Sorted Rows"
将结果加载回 Excel:
如果需要,您可以更改 headers 等等。
让我从这里的最佳选择 Power Query 开始(由 JvdV 发布)。但我想看看是否可以使用 Office 365 中的公式:
=LET(data,A2:D8,
data1,INDEX(data,,1),
cdata,COLUMNS(data)-COLUMNS(data1),
data2,INDEX(data,SEQUENCE(ROWS(data)),SEQUENCE(1,cdata,1+COLUMNS(data1))),
rdata2,ROWS(data2),
cdata2,COLUMNS(data2),
seq,SEQUENCE(rdata2*cdata2),
mseq,MOD(seq-1,rdata2)+1,
x,INDEX(data2,mseq,SEQUENCE(1,cdata2)),
unpiv,SUBSTITUTE(INDEX(x,mseq,ROUNDUP(seq/rdata2,)),"",""),
names,INDEX(data1,mseq),
a,CHOOSE({1,2},unpiv,names),
b,--(INDEX(a,,1)<>""),
SORT(FILTER(a,b=1),{1,2}))
这导致未旋转的 flights/names(没有 headers)按 flight/names 字母顺序排序:
数据库
| A | B | C | D |
---|-----------|--------------------|------------------|------------------|---
1 | Flight | Crew Member 1 | Crew Member 2 | Crew Member 3 |
2 | F001 | Michael | Katrin | Karl |
3 | F002 | Jennifer | Peter | Karl |
4 | F003 | Peter | | |
5 | F004 | Karl | Michael | |
6 | F005 | Jennifer | Michael | Katrin |
7 | F006 | Peter | Karl | Michael |
8 | F007 | Karl | Jennifer | |
注:
- table 中的每个名称都是唯一的。
- 每个名字每行只能出现一次。
预期结果
| E | F |
---|---------------|--------------------|--
1 | Name | Flights |
2 | Jennifer | F002 |
3 | Jennifer | F005 |
4 | Jennifer | F007 |
5 | Katrin | F001 |
6 | Katrin | F005 |
7 | Karl | F001 |
8 | Karl | F002 |
9 | Karl | F004 |
10 | Karl | F006 |
11 | Karl | F007 |
12 | Michael | F001 |
13 | Michael | F004 |
14 | Michael | F005 |
15 | Michael | F006 |
16 | Peter | F002 |
17 | Peter | F003 |
18 | Peter | F006 |
如您在 data-base
中所见,有一个包含多个航班的列表。
在 Columns B:D
中显示每个航班的机组人员。
现在我想列出每个机组成员的所有航班。
因此,我想知道我需要什么公式
a)根据在Column B:D
中出现的次数列出Column E
中的所有剧组成员
b) 在 Column F
你知道如何解决这个问题吗?
在这种情况下,我会选择 PowerQuery。
- 步骤 1) - Select 您的 table 并将其加载到 PowerQuery 中。
- 第 2 步) - Select 'Flight' 列和逆透视其余部分。
- 步骤 3) - 删除包含 Crewmembers 的列。
- 步骤 4) - 对 'Value' 列进行升序排序并过滤掉空行。
确实只需点击几下,但下面是 M-code 助您一臂之力:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Flight", type text}, {"Crew Member 1", type text}, {"Crew Member 2", type text}, {"Crew Member 3", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Flight"}, "Attribute", "Value"),
#"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute"}),
#"Filtered Rows" = Table.SelectRows(#"Removed Columns", each [Value] <> null and [Value] <> ""),
#"Sorted Rows" = Table.Sort(#"Filtered Rows",{{"Value", Order.Ascending}})
in
#"Sorted Rows"
将结果加载回 Excel:
如果需要,您可以更改 headers 等等。
让我从这里的最佳选择 Power Query 开始(由 JvdV 发布)。但我想看看是否可以使用 Office 365 中的公式:
=LET(data,A2:D8,
data1,INDEX(data,,1),
cdata,COLUMNS(data)-COLUMNS(data1),
data2,INDEX(data,SEQUENCE(ROWS(data)),SEQUENCE(1,cdata,1+COLUMNS(data1))),
rdata2,ROWS(data2),
cdata2,COLUMNS(data2),
seq,SEQUENCE(rdata2*cdata2),
mseq,MOD(seq-1,rdata2)+1,
x,INDEX(data2,mseq,SEQUENCE(1,cdata2)),
unpiv,SUBSTITUTE(INDEX(x,mseq,ROUNDUP(seq/rdata2,)),"",""),
names,INDEX(data1,mseq),
a,CHOOSE({1,2},unpiv,names),
b,--(INDEX(a,,1)<>""),
SORT(FILTER(a,b=1),{1,2}))
这导致未旋转的 flights/names(没有 headers)按 flight/names 字母顺序排序: