美文网首页Power BI干货
报表查询中“其他”情况的处理

报表查询中“其他”情况的处理

作者: 阿森纳里 | 来源:发表于2020-01-22 19:32 被阅读0次

    在处理表数据的时候我们经常会用到报表查询,一般情况下我们会用vlookup来进行处理,但vlookup不能处理多条件查询的问题,比如下面这个情况:

    问题的提出

    假设你在房地产公司上班,你是财务部小白,年终老板盘点年度盈利之后要你根据各季度各员工的表现发奖金,老板列出了奖金方案:

    奖金方案

    然后这是各季度的人员名单:

    人员名单

    总结一下奖金发放方案:

    • 一季度李小明是季度冠军,发一等奖1000元,其他人发二等奖500元;
    • 二季度康辉发一等奖,周迅发二等奖,其他人不达标没奖金;
    • 三季度董卿发一等奖,其他人发二等奖;
    • 四季度房子卖得好,所有人都发二等奖,以资鼓励;
    • 老板和周迅关系好,心想给她点照顾,所有季度都发一等奖!
    • 最后老板一想,这些年招工难,还是得给大家多发点福利,别让明年没人干活了,于是老板一拍大腿,决定其他所有人都发三等奖100元! 你只要在我这儿干过,哪怕只待过一天,我每个季度都奖你100块钱,此政策一出,还怕明年招不来人吗?!

    这种情况需要根据[季度]和[姓名]两个字段来匹配查询奖金方案,用vlookup是不行了,这时候可以用Power BI中的power query组件来处理,用它的合并查询Table.NestedJoin功能。

    但是且慢,合并查询只能处理完全匹配的情况,像一季度周迅的奖金就查询不到了,原因是只有在[季度]和[姓名]两个字段都完全匹配的情况下才能查询到,而一季度“周迅”是在“其他”范围内的,也就是说一季度除了李小明之外的其他人包括周迅、周涛都是二等奖,这样就匹配不上了。

    合并查询

    其他的一季度周涛、二季度陈鲁豫等都是同样的情况,为了处理这个问题,你当然可以让老板在“奖金方案”表中把每季度的每个人都列出来,但是这样的话还要你干什么,“其他”就代表了多个人,老板没时间把每个人的情况都一一告诉你,领导都喜欢归类,合并处理,需要你把领导的意思细化、具体化,你要是能把这件事做好,你就可以被提拔当主管了,然后就有新来的小年轻的给你干这活儿了,领导都是这么过来的。

    那么在我们还没当上领导之前呢,还是得想办法把这事儿做好,你要是自己在“奖金方案”表中添加行,把每个人的情况都列上,那么后来这个查询的步骤其实也就不用做了,所有的添加行完成之后“奖金方案”表其实就已经是10行了,这个例子中的员工数量不多,可以手动添加完成,可是如果你是恒大这样的集团公司财务部的小白呢,这里的“其他”代表着几万人,全国销售那多了去了,要是都一条一条手动添加的话会把你累死,更关键的是能在过年前把这表做好吗?别人的年终奖能不能拿到不好说,不过你的年终奖估计是没戏了。

    所以呢我们得另外想办法,其实仔细想一想,合并查询的过程就是一个筛选表的过程,指定筛选规则,从查询依据(“奖金方案”表)中筛出符合条件的情况,然后把它带进目标表中,比如一季度李小明是一等奖,那就把这个情况写到“员工名单”这个表的后头,这就变成了另一张表“获奖情况”表,而一季度除李小明外的那几个人都是二等奖,那就把这个情况也写到相应的人后面就行了,这就是人们的一般思路,很简单。

    办法:筛选查询

    所以办法来了,我们用Table.AddColumn来处理:

        查询 = Table.AddColumn(人员名单表, "奖金方案", each let 
            _1 = Table.SelectRows(奖金方案表, 
                  (x)=>(x[季度]=[季度] or x[季度]="其他") and 
                       (x[姓名]=[姓名] or x[姓名]="其他" or x[姓名]="所有人")), 
            _2 = Table.First(_1, [奖项="三等奖", 奖金=100])
            in _2),
    

    解释:第一步

    这段代码的意思是在人员名单表的后面加一列“奖金方案”,每行统一处理,根据人员名单表每行的[季度]、[姓名]去“奖金方案”表中去找符合条件的行,[季度]、[姓名]代表着人员名单表中的内容,比如第一行是一季度、李小明,第二行是一季度、周迅,(x)代表着奖金方案表中的某行,x[季度]、x[姓名]代表着这行的字段内容,比如第一行是一季度,李小明,第二行是一季度、其他。

    这个处理的过程就是看到人员名单表中第一行是一季度、李小明,所以去奖金方案表中去筛选出符合条件的行,就是第一行;而人员名单表中的第二行是一季度、周迅,所以去奖金方案表做筛选,可是我们发现没有符合这个条件的行,原因是周迅包含在一季度其他人里,直接筛选“其他”当然筛选不到了,这时候我们就需要把“其他”也筛选出来,所以是x[季度]=[季度] or x[季度]="其他"。

    而在筛选姓名的时候,发现奖金方案表中有个姓名是“所有人”,所有人都包含在这个选项中,所以应该把它也筛选出来。

    这是第一步,筛选之后每一行都可得出相应结果:

    筛选结果

    查询到的筛选表里取满足条件的奖金发放方案可能不止一行,我们取第一行就可以了。

    解释:第二步

    但是很快,我们发现二季度的陈鲁豫没奖金可领,怎么回事呢,按照第一步的查询规则,二季度康辉领一等奖,周迅领二等奖,其他人呢,奖金方案表里没说,一、三季度的其他人领二等奖,但是二季度没说其他人领几等奖,但是,但是后来老板又说了——【注:其他一律按三等奖100元发放】,所以说二季度陈鲁豫这个情况也可以领三等奖,虽然表现不怎么样,但是老板发慈悲给了雨露均沾奖,所以感恩吧。而这条规则写在奖金方案表之外,写在它后面,什么意思呢,意思就是如果上面那些规则都不适用的话,那么就根据这条普惠政策发奖金,这可以保证所有人都可以领到奖金,老板就是这么关心员工。

    所以说,在查询语句里,我们就应该把这条例外规则写上,这就有了第二步:

    _2 = Table.First(_1, [奖项="三等奖", 奖金=100])

    这条语句的意思是,在筛选表里取第一行,如果是空表的话就返回[奖项="三等奖", 奖金=100]这样一个record,方括号括标识着record,实际上一个表格中的每一行都是一个record,一个record可能有多个field(字段/属性),每个field有fieldname(属性名)和fieldvalue(属性值),取第一行,也就是取到了一个record,而当这个record为空时则返回[奖项="三等奖", 奖金=100]这个缺省的record,于是,二季度时陈鲁豫也就分到奖金了。

    优先级问题

    事情还没完,再仔细看一下取到的奖金分配方案,发现周迅有点麻烦,比如根据奖金方案表中的规则4,根据二季度周迅的表现该发二等奖,可从最后一条规则又可以看出周迅和老板关系不一般,最后老板想起她来了,大笔一挥规定给周迅统一发一等奖,那么二季度时周迅该发几等奖呢?这时候就要请示一下领导了,因为很多类似这种时候领导自己也是稀里糊涂的,说过的话前后矛盾,制定的政策相互抵触,这是常有的事儿,特别是在大公司、大部门、多个领导指点江山的时候特别容易出现这样的事情,要知道这个“奖金方案表”可能并不止出自于一个领导之手啊,王总说二季度给周迅发二等奖,后面李总又说所有季度周迅都发一等奖!那么到底该听谁的呢?这时候有经验的秘书就体现出作用来了。

    怎么办?揣摩上意,把握分寸,拿捏到位,妥善解决!
    如果这几条规定出自一个领导之手,就根据周迅和他的关系猜测一下:老板肯定是最后想到周迅的好来了,所以要特别照顾,所以不管怎样所有季度都给她一等奖!如果是出自两个领导之手,那么要根据领导的位置来决策,平时王总罩着周迅,可李总见到她总是不苟言笑,李总是人力资源部总监,又是董事会成员,王总只是财务部总监,和管理层没有一点亲戚关系,只是因为周迅的姐夫所以要照顾她,我认为肯定是李总从大局考虑要确保员工管理的公平公正,所以秉公执法要求二季度给周迅发二等奖!而王总的面子也不能不给,李总说一季度除李小明外的其他人都发二等奖,这里面没有明确说周迅发几等奖,而王总明确说了周迅除二季度外都发一等奖,这样我一季度给周迅一个一等奖,我想也不会太拂李总的面子吧!你明确说了二季度给她二等奖,这我做到了,其他季度又没明确说不给她一等奖,那么我就可以灵活处理了。

    有的时候想搞平衡让上下各利益方都满意可真是难啊,我们的做法就是钻规则的空子,左右逢源,八面玲珑,大搞平衡,舍我其谁!

    想通了规则就开始一顿操作猛如虎了,其实做法就是要在“奖金方案表”中给予冲突规则以优先级:二季度明确说了给周迅发二等奖就严格按确保落实,这是第一优先级,其他季度给她一等奖,这是第二优先级,再其他情况按表中“其他”人的规定给她发奖金,这是第三优先级(在这里好像没有第三种情况)。

    优先级

    根据优先级给奖金方案表排序,有冲突的规则按优先级排列好,除了周迅之外其他人的情况也要保证优先级顺序,像一季度李小明发一等奖(规则1)是第一优先级,其他人发二等奖(规则2)是第二优先级,只要保证规则2在规则1之后就可以了。严谨起见所有规则都可以给予优先级,不过很多时候没必要搞那么细。

    得出分配表

    在“筛选查询”的基础上,展开查询到的“奖金方案”列就可以得出应有的奖项和奖金数额了。

    获奖情况

    规则的重要性

    在这个问题中很重要的一点就是明确规则,只要规则明确,得出分配方案其实很简单,就像盖一座房子,只要有明确的图纸,根据图纸来建设,大家拧成一股绳,劲儿往一处使,撸起袖子加油干,一张蓝图绘到底,很快我们就会完成了,这就是中国效率,人心齐,泰山移,团结就是力量,什么时候都需要有统一的领导,明确的规则。这有点类似于拍卖者假定。

    但难就难在很多时候规则并不明确,甚至很多时候规则还是混乱的,什么原因呢?九龙治水,官多法乱,朝令夕改,前后矛盾,无所适从。无论在什么时候,哪个国家,决策层总有一帮闲人,只会纸上谈兵,却总想体现自己的重要性,什么事儿都要插上一脚,结果搞得适得其反,所以《左传》中有个说法叫做:肉食者鄙,未能远谋,发号施令的那帮家伙未必就比常人高明到哪里去,甚至很多时候在管理层中,这样的家伙还为数不少,根据二八法则,只有20%的人才是掌握核心价值的,无论在哪里,混饭吃的人总是占大多数,我们无法完全杜绝在其位不谋其事的情况,我们所能做到的是尽可能地让这帮家伙不要没事儿找事儿帮倒忙,这样我们就已经谢天谢地了。一个很典型的例子,现在的英国首相鲍里斯·约翰逊,就不一定比隔壁老王高明到哪里去,一个土鸡的后代能有多大本事,可英国人就是买他的账,那么他的脑残政策的后遗症可能要多年以后才会凸显出来,到时候后悔也晚了。

    最后,奉上一个“冠多发乱”的故事。

    明太祖朱元璋当了皇帝,准备大封功臣和亲朋。功臣有数,亲朋却多如牛毛,他一时不知如何处置,闷闷不乐。这天,军师刘伯温劝朱元璋出去溜达,朱元璋正想散散心,两人便微服出去了。
    刘伯温带朱元璋走进城隍庙里,只见大殿西侧围满了人,一边观看墙上的壁画,一边议论。朱元璋和刘伯温上前一看,原来是一幅怪画:上面画着一个人,头发乱得像鸡窝草一样,一束束竖起来,每束都顶着一顶帽子。朱元璋左看右看,也不明白它的意思,回到宫里又想了一夜,还是想不出什么道理来。
    第二天一早,朱元璋把刘伯温叫来,问他那幅壁画为什么画成这个样子。刘伯温笑了笑,说:“这幅画含义很深刻,它说明一个道理,就是冠(官)多发(法)乱呀!”
    那时,朱元璋的头脑还比较清醒,一听就醒悟过来,点着头说:“官多法乱,画得不错。好,传我旨意,寡人决定只封功臣,不封亲朋啦!”

    说起来,刘伯温号称朱元璋第一谋士,明朝建国后却只被朱皇帝封了个“诚意伯”的爵位,功劳不如他却封公封侯的人多了去了,这里面不能不看出老朱的权谋和驭臣之术,这是另外一个话题了,有空再来谈。

    实例下载:
    链接:https://pan.baidu.com/s/1nJT4yR3H9guM24JgxRZaoA
    提取码:s0aq
    复制这段内容后打开百度网盘手机App,操作更方便哦

    相关文章

      网友评论

        本文标题:报表查询中“其他”情况的处理

        本文链接:https://www.haomeiwen.com/subject/mrmuzctx.html