我不知道将去何方,但我已经在路上 — 千与千寻
如果数据原表中列很多,而且因为系统命名规则的原因列名长且复杂,我们需要取出其中的某些指定列,并且重命名为简单直观的名字,如何可以快捷实现?
数据原表
当然可以直接选择列然后在手工重命名,这样后期维护成本会很高。结合M函数,我们可以制作一个动态获取指定列,并重命名列名的模型。
一、创建列名映射表
我们将原始列的列名在Excl中转置过来,在旁边增加新列,输入需要选择的列和新的列名。
列名映射表
将该表加载到Power Query中以后,通过筛选将【选择的列】里面的空白(null)去掉,就可以实现只提取指定列了。
当我们需要增加新的列时,只要在【选择的列】里输入该列名的简称即可。
通过表格与筛选的联动就实现了动态获取列,使模型产生了交互效果。
二、选择列 Table.SelectColumns
选择列的 M函数是 Table.SelectColumns,它的使用语法是:
忽略框选参数,其实只需要向函数提供两个参数,第一个参数是表,第二个参数是需要选择的列,以列表的形式提供。
如果不熟悉M函数,在Power Query中,可以先使用界面功能中的「选择列」功能来选择列,在公式栏中会自动生成代码:
表是上一个步骤【更改的类型】,不需要修改。为了实现动态交互,需要修改第二个参数列名称列表。
第二个参数列表里面的列刚好是我们列名映射表里的第一列【原始列】,所以可以将公式栏中的M代码修改成以下:
列名映射表[原始列]返回的是列名映射表的第一列,而且返回的类型刚好是列表,因此可以制作作为Table.SelectColumns的第二个参数。
三、重命名列 Table.RenameColumns
同样的,可以在先执行界面功能中的重命名操作,然后通过观察的方式修改M代码。
我们重命名其中两列,得到的代码如下:
其中第二部分:{{"编号","员工编号"}, {"客户资产-一般性存款余额-期末时点","存款余额"}}是一个列表,当然列表也是由列表组成(List of List)。
组成列表的列表由旧列名和新列名组成:{"编号","员工编号"}。
可以概况为:。对应列名映射表的第一列和第二列。我们可以使用List.Zip函数将新旧列名按要求进行组合。
我们可以点击fx测试输出结果,在预览中可以看到正是我们需要的新列名和旧列名的组合,并且输出的也是列表。
使用以上语句替换掉Table.RenameColumns的第二个参数,两个查询之间就可以实现联动了。
结果表:
DAX 冷知识,超级开脑洞的DAX函数写法
使用自定义M函数「打包」数据处理流程
获取刷新时出现的常规错误 | Power Query错误处理