【需求】有一份成绩数据,包含137名学员,分属11个单位,现在需要在这11个单位内分别对学员排序。效果如下:
经过自己研究、同事和网友@张振龙_6a11
提醒,以及爬网,目前找到了可用的五种办法。以下按推荐次序一一罗列。
【方法一:利用Excel的COUNTIFS和SUMPRODCUT函数排序】
这是最有效最直接的办法。无论有多少个组织单位需要内部排名,都可以用一个公式搞定。
感谢@张振龙_6a11在评论中提醒,因为自己对excel函数不熟,所以爬网后照猫画虎解出了结果。
**COUNTIFS函数版:
=COUNTIFS(A:A,"="&A2,C:C,">"&C2)+1
**SUMPRODUCT函数版:
=SUMPRODUCT(($A$2:$A$138=A2)*($B$2:$B$138<>B2)*($C$2:$C$138>C2))+1
【方法二:利用DAX的RANKX函数排序】
此方法是我自己学习DAX的RANKX函数后搞定。
1.将成绩表引入数据源,建立模型。可以直接在excel表格内以插入数据透视表的方式将成绩数据加入数据模型,也可以用powerquery引入数据源并加载到数据模型。方法不赘述。
2.建立【单位内排名】的度量值,DAX公式如下:
=IF(HASONEVALUE('区域'[单位]),RANKX(ALLSELECTED('区域'[姓名]),'区域'[以下项目的总和:总分]),BLANK())
注意那个【总分】列,不是直接将其加入RANKX函数,而是要用聚合函数将其加入。由于我在数据透视表中采取的是拖动【总分】到数值区域,所以DAX自动帮我生成了一个【'区域'[以下项目的总和:总分]】度量值。加入到RANKX的是这个自动生成的度量值,而不是【总分】列。
见示例文件中的“powerpivot版”sheet。
【方法三:excel自定义排序+手动填充排名序列】
首先按单位排序,然后再按总分高低降序排列,这样就生成了按单位排列分数高低的数据。然后添加一列,手动填充序列。有多少个单位填充多少次。
这是同事王苗苗告诉我的办法,感谢。
见示例文件中的“excel排序版”的【手动填充排序】列。
此方法比较直观,好操作,但是当单位很多的时候,手动填充排序很容易出错。
【方法四:excel的rankx函数排序】
首先按单位排序,无需对成绩排序。然后用excel的rankx函数对【总分】列进行排序操作。有多少家单位就要写多少个rankx函数,操作比【方法二】还繁琐。
这是我自己想出来的办法。
见示例文件中的“excel排序版”的【rankx】列。
【方法五:用powerquery排序】
此方法在http://blog.csdn.net/zhongguomao/article/details/54561814看到,作者示例的是三个班级,但我给出的示例文件有11个单位,所以偷懒没实际操作。个人感觉这个方法是一种思路,但是并不直观,操作起来也比前三种方法繁复,所以放到最后推荐。
示例文件下载:链接: https://pan.baidu.com/s/1c2ATH2w 密码: mkiz