PQ实战 | 快速找出差异数据,数据变动及时更新

本次案例根据实际情场景改编,一定程度上体现了PQ的高效数据清洗和核对能力!也算是一个真正实际应用过程中的M函数书写展示!
业务场景
业务场景:分公司A和分公司B距离较近,经常发生交叉签单的情况,发生这种情况,需要在实际签单公司登记,最后合并到一起计算!在合并数据时,为了确保准确性,使用姓名和身份证号码作为条件!避免重名或者同人身份照号码录入不一致导致的错误!但是这种情况下,一般遇到姓名或者身份证号码录入错误就无法准确合并,所以我们要找出同名但身份证号码不同的数据进行核实是否同一人,以及身份照号相同姓名不同的数据!
模拟数据如下:一人可能有多条数据
找出姓名同身份照号不同的数据
加载进入PQ等基础,这里就不再介绍,不懂的同学,可以看一下
PQ入门第一期:PQ 第一期 | Power Query是什么?怎么学?
先说一下处理思路:
按照姓名分组,因为一个人可能有多条件记录,所以分组后,我们需要对身份号去重,对于不重复值,我们还要看是哪一个分公司的,后续沟通处理,所以我们需要对去重的身份证号和公司名称拼接一下,放在一个单元格中!
具体操作如下:

01 |  按照姓名分组处理

= Table.Group(源,"姓名",{"res",each _})
姓名相同的数据会聚合到一起形成Table,后续我们对这个table进行处理!

02 | 去重找异常

看上去是不是有点有点多有点复杂,其实这就是我一般在实际使用过程中的基本常态!所以不用担心,只要我们思路清晰,非常简单!
格式化一下方便我们解读:
代码思路解读:
1、相同姓名在不同分公司或者相同分公司都有可能有多条数据,所以我们第一步考虑把身份证号和分公司(名称)这两列提取出来,然后去重,Table.SelectColumns 名字够直接了,就是选取列!多列使用list即可!不要告诉我你不知道什么是list(查看入门第二期),去重Table.Distinct,也够直接,不用多讲,这里使用Record包裹,是因为我们后面还需要使用到【提取两列】这个过度表,这样就不用重复写,直接使用!未来也可以使用let …… in 结构!
2、上一步去重后,可以排除掉重复的数据,但是一个人只要在两个公式都出现就有会两条记录,所以我们还要对身份证号去重,正常情况下一个人一个身份证号码,结果肯定是一条,所以我们最后要的结果就是 去重身份证号码个数大于1 且 身份证号和分公司去重 行数 大于1
3、找出这些满足条件的数据,结果是两列,我们希望先号码和分公司合并,然后再 每一行合并,放在一个单元格,这里的#(lf)表示换行符,PQ中特殊符号或者系统自带的一般都使用#开头 比如#shared,#table构建比较等。
Text.Combine大家比较熟悉了,使用分隔符合并两个文本!

03 | 排除空值,得到结果

最后筛选 不等于空的结果!其实这一步也可以直接合并到上面一步搞定!

04 | 修改数据,刷新动态更新

全部源码:(左右滑动查看或者复制到PQ编辑器)
let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    自定义1 = Table.Group(
        源,"姓名",
            {"res",each
                [提取两列 = Table.SelectColumns(_,{"身份证号码","分公司"}),
                号码去重 = List.Count(List.Distinct([身份证号码])),
                两列去重 = Table.Distinct(提取两列),
                结果=
                    if Table.RowCount(两列去重)>1 and  号码去重 >1 then 
                        Text.Combine(
                            List.Transform(Table.ToRows(两列去重),
                                    (x)=>Text.Combine(x,":"))
                                ,"#(lf)"
                            )
                    else ""
                ][结果]
            
            }
        ),
    筛选的行 = Table.SelectRows(自定义1, each ([res] <> ""))
in
    筛选的行
为了大家理解方便,我们代码中大部分变量都使用的中文,实际情况,大家可以根据习惯来,个人开发,可读性也可以适当往前靠靠,方便维护!
身份证相同姓名不同
原理基本差不多,我们就直接来写:
可以看到两个异常一个是末尾添加的了空格,一个是许褚写成了徐诸,不筛选出来我们是很难看出的!
在PQ编辑中,我们使用双斜杠来注释,这算是一个新的知识!
本次我们稍微换一下思路,更清晰,先判断新名是否唯一,不唯一再两列去重合并,本次使用合并两列的Table.CombineColumns函数,这些函数都比较简单,基本大家学完前两期基础,这些看一下是完全没有问题的了!
let …… in 结果会在我们以后的基础教程中继续讲解!

小结一下

1、对于很多PQ新手一看M函数代码这么长就放弃了,其实M函数和Excel函数嵌套一样,掌握参数和每个函数的结果类型,思路清晰非常简单!
2、使用PQ的好处是,本次写好后,以后再有类型的情况,我们只要更新数据源,右击刷新即可,不用每次都去处理一边。同时相对于VBA要简单很多!
本文由“壹伴编辑器”提供技术支持
(0)

相关推荐