培训
逆透视列
在 Power Query 中,可以将列转换为属性值对,其中列变成行。
关系图,其中显示了包含空白列和行的左表,以及作为列标题的“属性”值 A1、A2 和 A3。 在此表中,A1 列包含值 V1、V4 和 V7。 A2 列包含值 V2、V5 和 V8。 A3 列包含值 V3、V6 和 V9。 逆透视列后,关系图的右表就会包含空白列和行,“属性”列包含九行,其中 A1、A2 和 A3 重复三次,“数值”列包含 V1 到 V9 的值。
例如,下表中,国家/地区行和日期列创建了值矩阵,因此很难以可缩放的形式分析数据。
表的屏幕截图,其中包含设置为文本数据类型的“国家/地区”列,以及设置为整数数据类型的三列,其中日期为 2023 年 6 月 1 日、2023 年 7 月 1 日和 2023 年 8 月 1 日。 国家/地区列第 1 行包含美国,第 2 行包含加拿大,第 3 行包含巴拿马。
相反,可以将表转换为包含无透视列的表,如下图所示。 在转换后的表中,使用日期作为筛选属性会更方便。
表的屏幕截图,其中包含设置为文本数据类型的“国家/地区”列、设置为文本数据类型的“属性”列和设置为整数数据类型的“数值”列。 “国家/地区”列的前三行包含美国,后三行包含加拿大,最后三行包含巴拿马。 “属性”列的第一行、第四行和第七行包含日期 2023 年 6 月 1 日,第二行、第五行和第八行包含日期 2023 年 7 月 1 日,第三行、第六行和第九行包含日期 2023 年 8 月 1 日。
这种转换的关键在于,表中有一组日期,这些日期应属于一列。 每个日期和国家/地区的相应值应位于不同的列中,这样就有效地创建了属性值对。
Power Query 始终使用两列来创建属性值对:
- 属性:逆透视的列标题名称。
- 值:每个逆透视列标题下的值。
在用户界面中有多个地方可以找到逆透视列。 可以右键单击要逆透视的列,也可以从功能区中的“转换”选项卡中选择该命令。
有三种方法可以逆透视表中的列:
- 逆透视列
- 逆透视其他列
- 仅逆透视选定列
对于上述方案,首先需要选择要逆透视的列。 可以按住 Ctrl 键,根据需要选择尽可能多的列。 对于此方案,除了名为“国家”的列外,你需要选择其他所有列。 选择列后,右键单击任何所选列,然后选择“逆透视列”。
表的屏幕截图,其中选择了“2023 年 6 月 1 日”、“2023 年 7 月 1 日”和“2023 年 8 月 1 日”列,并且快捷键菜单中选择了“逆透视列”命令。
操作结果如下图所示。
按照上述的步骤创建查询后,假设初始表已更新为如以下屏幕截图所示。
表的屏幕截图,其中包含相同的原始“国家/地区”、“2023 年 6 月 1 日”、“2023 年 7 月 1 ”日和“2023 年 8 月 1 日”日期列,并添加了“2023 年 9 月 1 日”日期列。 国家/地区列仍包含美国、加拿大和巴拿马的值,但第四行增加了英国,第五行增加了墨西哥。
请注意,正在为 2023 年 9 月 1 日 (9/1/2023) 添加新列,以及为“国家/地区”英国和墨西哥添加两个新行。
如果刷新查询,会发现操作已在更新的列上完成,但不会影响最初未选择的列(本示例中的“国家/地区”)。 这意味着也将逆透视添加到源表的任何新列。
下图显示了使用新更新的源表刷新之后查询的样子。
表的屏幕截图,其中包含“国家/地区”、“属性”和“数值”列。 国家/地区列的前四行包含美国,第二个四行包含加拿大,第三个四行包含巴拿马,第四个四行包含英国,第五个四行包含墨西哥。 “属性”列的前四行包含日期 2023 年 6 月 1 日、2023 年 7 月 1 日和 2023 年 8 月 1 日,每个国家都重复这四行。
你还可以选择不想逆透视的列,然后逆透视表中其余列。 这就是逆透视其他列操作的作用所在。
该操作的结果将与从“逆透视列”得到的结果完全相同。
表的屏幕截图,其中包含设置为文本数据类型的“国家/地区”列、设置为文本数据类型的“属性”列和设置为整数数据类型的“数值”列。 “国家/地区”列的前三行包含美国,后三行包含加拿大,最后三行包含巴拿马。 “属性”列的第一行、第四行和第七行包含日期 2023 年 6 月 1 日,第二行、第五行和第八行包含日期 2023 年 7 月 1 日,第三行、第六行和第九行包含日期 2023 年 8 月 1 日。
备注
这种转换对于列数未知的查询来说至关重要。 该操作将逆透视表中的所有列,但所选列除外。 如果方案的数据源在刷新时增加了新的日期列,则这是理想的解决方案,因为这些列将被选中并逆透视。
与“逆透视列”操作类似,如果刷新查询并且从数据源中选取了更多数据,则除之前选择的列外,将逆透视所有列。
为了说明此过程,假设有一个类似下图的新表。
表的屏幕截图,其中包含“国家/地区”、“2023 年 6 月 1 日”、“2023 年 7 月 1 日”、“2023 年 8 月 1 日”和“2023 年 9 月 1 日”列,所有列都设置为文本数据类型。 国家/地区列从上到下依次为美国、加拿大、巴拿马、英国和墨西哥。
可以选择“国家/地区”列,然后选择“逆透视其他列”,结果如下。
表的屏幕截图,其中包含“国家/地区”、“属性”和“数值”列。 “国家/地区”和“属性”列设置为“文本”数据类型。 “值”列设置为“整数”数据类型。 国家/地区列的前四行包含美国,第二个四行包含加拿大,第三个四行包含巴拿马,第四个四行包含英国,第五个四行包含墨西哥。 “属性”列的前四行包含 2023 年 6 月 1 日、2023 年 7 月 1 日、2023 年 8 月 1 日和 2023 年 9 月 1 日,每个国家都重复这四行。
最后一个选项的目的是仅从表中逆透视特定列。 此选项对于处理数据源中未知数量的列并且只想逆透视所选列的应用场景非常重要。
若要执行此操作,请选择要逆透视的列,在本示例中是指除国家/地区列之外的所有列。 然后右键单击所选的任何列,然后选择“仅逆透视所选列”。
请注意此操作将产生与前面示例相同的输出结果。
表的屏幕截图,其中包含设置为文本数据类型的“国家/地区”列、设置为文本数据类型的“属性”列和设置为整数数据类型的“数值”列。 “国家/地区”列的前三行包含美国,后三行包含加拿大,最后三行包含巴拿马。 “属性”列的第一行、第四行和第七行包含日期 2023 年 6 月 1 日,第二行、第五行和第八行包含日期 2023 年 7 月 1 日,第三行、第六行和第九行包含日期 2023 年 8 月 1 日。
刷新后,如果源表中新增了“9/1/2020”列以及“英国和墨西哥”新行,查询的输出结果将与前面的示例不同。 假设源表在刷新后变成了下图中的表。
查询的输出如下图所示。
之所以看起来像这样,是因为逆透视操作只应用于 6/1/2020、7/1/2020 和 8/1/2020 列,因此标题为 9/1/2020 的列保持不变。