Power Query里的匿名函数是什么鬼?这个例子最典型了。
小勤:我现在有个按营业额不同等级的提成比例表,怎么用Power Query读到营业额数据表里?如下图所示:
大海:这个问题如果是在Excel里的话,用Lookup函数非常简单。
小勤:这我知道啊,但我要考虑跟其他数据处理过程都做成全自动的,所以还是考虑用PQ来处理,但PQ里却好像没有Lookup函数。
大海:嗯。虽然PQ里没有Lookup函数,但是,用PQ处理也不复杂,主要是使用Table.SelectRows和Table.Last函数来实现。写法如下:
Table.Last(
Table.SelectRows(
提成比率表,
(t)=>t[营业额]<=[营业额]
)
)[提成比例]
其实现思路如下:
1、用Table.SelectRows函数筛选提成比率表里营业额小于数据源表当前行营业额的所有数据,类似于在Excel中做如下操作(比如针对营业额为2000的行,到提成比例表里取数据):
那么,Table.SelectRows的结果如下图所示:
2、在Table.SelectRows得到相应的结果后,我们就可以用Tabe.Last该结果的最后一行,即:
3、得到筛选表最后一行后,要取提成比例,即可以直接用“提成比例”字段名来得到。
小勤:Table.SelectRows函数感觉有点难啊,里面为什么有个(t)=>t[营业额]<=[营业额]?
大海:这其实是Table.SelectRows进行筛选表操作时的条件,这相当于将一个自定义函数用于做条件判断,其中的(t)表示将提成比例表作为参数,而t[营业额]表示提成比例表里的营业额列,而最后面的[营业额]指的是数据源表里的营业额,这里面注意不要搞乱了。如下图所示:
实际上,你还可以先写一个自定义函数,然后直接在Table.SelectRows里面进行引用,具体写法如下:
后面就可以引用该自定义函数完成数据的匹配,如下图所示:
小勤:嗯,这种分开编写自定义函数的感觉好像更容易理解一些。
大海:PQ里的函数式写法跟Excel里的公式不太一样,慢慢适应就好了。