小白求教: mysql 怎么实现排序后新增一列并分区段赋值,比如分数排名前 20%的就是绩效 A,后 10%的就是绩效 C

2019-05-26 09:40:52 +08:00
 ditie

比如数据表 kaohe 的字段有 id,department,date,userid,score。

需求有三个: 1、怎么根据 score 在一个语句里分月度、分部门进行组内排序,以及当月全体排序?

2、怎么能多一列来显示自动分布的绩效?排名前 20%的就是绩效 A,后 10%的就是绩效 C

3、怎么把这个排序和新增后的绩效结果全部插入到一个新表里?

我是 MySQL 数据库,木有 row_number ()函数

7503 次点击
所在节点    MySQL
67 条回复
Alexhohom
2019-05-26 21:16:03 +08:00
@ditie #19 比如你根据一些需求排序后,你的 query 里会有 count 属性,然后代码里想要控制多少数目都行。
Alexhohom
2019-05-26 21:17:39 +08:00
@ditie #40 想要分月度就 group by month 分部门就 group by department 同时 group by month,department
ditie
2019-05-26 21:30:49 +08:00
@Alexhohom group by 我会了。现在碰到俩问题:

背景:数据表 kaohe 的字段有 id,department,date,userid,score。数据表 staff 有 userid,username,department

1、我有 100 个员工,当月可能只有 30 条员工的考核记录,那么最后 group by 员工号统计时另外 70 人就没有月度(KH.date)的值,请问该怎么让这 70 个人的结果里也有一致的月度值。语句是这样:
select KH.date,ST.userid,St.username,sum(KH.score)+100 as total
from staff as ST
left join on kaohe as KH on ST.userid=KH.userid
group by KH.date,KH.userid


2、count 属性该怎么体现或者加工出来,每个月给前 20%的人赋值为 A,后 10%的人为 C,其他人为 B
Alexhohom
2019-05-26 21:39:05 +08:00
1. sql server 中可以这样(case sum(KH.score)+100 when 100 then -1 else sum(KH.score)+100 end) as total,其中-1 是你自己确定的。
2. count 在代码中执行完 query 会有一个返回吧,就是你需要从数据库中取值的那个变量。count 可以帮助你遍历你的查询
ditie
2019-05-26 21:58:24 +08:00
@Alexhohom 完了,这两条我都没看明白 - -@ 。第一个点是用来实现什么效果的呢?第二个 count 我还是不懂是指什么,count(*) 这样的记录数?
Alexhohom
2019-05-26 22:04:45 +08:00
@ditie #45 1. 就相当于 sql 里面的 if 语句, 如果考核表没有记录,那么 sum(kh.score)+100=100,发现这样的记录使其 total=-1。
2. 第二个就是你执行 query 后,没有报错会返回一个 result (我刚刚查的,没用过 nodejs ),result 中应该有 count 相关属性吧。result.count 这类的。
ditie
2019-05-26 22:08:58 +08:00
@Alexhohom 嗯,第一点我知道 sql 这么写执行后的结果,但这个结果和我的需求没关系呀,还是不能分出百分比然后赋值;第二点这个返回的 result 不就是后台执行 sql 的结果么?你的意思是 sql 不动了、在前台用代码来实现分出百分比然后赋值的效果?然而这个前台的代码我也不会。。。
Alexhohom
2019-05-26 22:17:45 +08:00
@ditie #47 对的,sql 语句排序不行就用后台代码实现,换一种思路。第一个不是解决让其他 70 个人的值一致嘛
mmdsun
2019-05-26 22:52:57 +08:00
最终显示效果是怎么样的?这样?
(月 score 部门,月 score 全体,绩效)
xuanbg
2019-05-27 07:19:40 +08:00
分 3 次操作就简单了呀,先不要管什么 ABC,把数据存进去。然后再把排序在前 20%的更新成 A,最后把倒序前 10%更新成 C。
楼上那些无脑查询让代码处理的,就没遇到过数据量太大导致磁盘 IO 和网络 IO 飞起么?
DRcoding
2019-05-27 09:19:08 +08:00
有了序号就简单了:
SELECT (@i := @i + 1) as ord FROM XXXX ,(SELECT @i := 0) i ORDER BY .....
ratel
2019-05-27 09:32:27 +08:00
可以增加另外的统计表,不建议太复杂的 SQL
ditie
2019-05-27 09:36:20 +08:00
@Alexhohom 昨晚睡觉了。。。这么操作数据是一致成-1 了,但是并不是一致成月度日期呀
ditie
2019-05-27 09:38:00 +08:00
@mmdsun 是的,我想要的数据是结果是 月度,部门,员工 ID,score,部门内排名,绩效(根据部门内排名的百分比分布来给 ABC ),全公司排名
ditie
2019-05-27 09:39:02 +08:00
@DRcoding 嗯,我通过这个实现了部门内部的排名,还差两个:一个是分出百分比来给绩效、第二个是全公司排名
ditie
2019-05-27 09:39:54 +08:00
@xuanbg 分三次,是要写存储过程么,这个又超出了我的技术水平。。。
ditie
2019-05-27 09:40:38 +08:00
@ratel 那就是楼上说的分步骤操作?
Beeethoven
2019-05-27 09:56:59 +08:00
为什么一定要一个 sql 查出来呢,后台代码实现要简单很多而且性能高很多,一次把需要的数据全部查出来,然后分类输出就好了
Beeethoven
2019-05-27 10:03:05 +08:00
java 的话就新建一个 examine 实体,department,date,userid,score 四个属性,再加一个 rank 来分类,根据条件查出来然后循环赋值 rank 给前端显示需要的结果。

插入到新表中就用代码 insert 回去就好了
Alexhohom
2019-05-27 10:38:56 +08:00
@ditie #53 order by month,total 这样是先按月度排序,然后按 total 排序。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/567720

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX