比如数据表 kaohe 的字段有 id,department,date,userid,score。
需求有三个: 1、怎么根据 score 在一个语句里分月度、分部门进行组内排序,以及当月全体排序?
2、怎么能多一列来显示自动分布的绩效?排名前 20%的就是绩效 A,后 10%的就是绩效 C
3、怎么把这个排序和新增后的绩效结果全部插入到一个新表里?
我是 MySQL 数据库,木有 row_number ()函数
1
tairan2006 2019 年 5 月 26 日 via Android
答案是用 Python
|
2
lihongjie0209 2019 年 5 月 26 日 不懂 sql 的话直接在代码里实现.
|
3
leriou 2019 年 5 月 26 日
case when
|
4
DefoliationM 2019 年 5 月 26 日 via Android
很简单 使用游标
|
5
ditie OP @tairan2006 并不会呀。。。
|
6
ditie OP @lihongjie0209 代码里更不会了。。。
|
7
Cat73 2019 年 5 月 26 日
MySQL 有 count,有 limit,麻烦点的思路可以先查记录的 id,然后 where id in ( ... )
|
9
ditie OP @DefoliationM 游标。。。我百度了下都没明白。。。
|
11
Huelse 2019 年 5 月 26 日
呃,我的理念是,任何多余的 where 条件都不写,全部交给语言去处理
|
13
francis59 2019 年 5 月 26 日
太复杂的话要么写程序分析,要么复制到 excel 里用公式分析,excel 有不少统计分析的公式
|
14
Alexhohom 2019 年 5 月 26 日
前 20%可以在代码里实现
|
15
thedog 2019 年 5 月 26 日
用 rank() over(partition by ....)
您可以搜一下这个东西的用法 |
16
thedog 2019 年 5 月 26 日
哦,没有 row_number,那当我没说。。。
|
20
lolizeppelin 2019 年 5 月 26 日 over 是窗口函数 mysql 8.0 mariadb 10.2 以后支持
|
21
zeraba 2019 年 5 月 26 日 via Android
搜索 mysql 添加行号,有了行号有序的列表实现这个需求应该很简单了
|
22
Takamine 2019 年 5 月 26 日 via Android
换 postgerSQL。:doge:
|
24
sinchuan 2019 年 5 月 26 日 via iPhone
存储过程。尽量语句分开写,方便日后有变更。
|
25
Umenezumi 2019 年 5 月 26 日
求总 Count 然后根据需要 when case
|
26
zxcslove 2019 年 5 月 26 日 via Android
插句话,假设有并列名次遇到区段边界如何处理?
|
28
ditie OP @lolizeppelin 5.7 版本呀,我倒想换呢,无奈我说了不算
|
33
acehow 2019 年 5 月 26 日 via Android
MySQL8 支持 over 开窗函数。
|
35
webdisk 2019 年 5 月 26 日
弄完之后发现自己的绩效是 C
|
36
strcmp 2019 年 5 月 26 日
redis zset
|
37
zander1024 2019 年 5 月 26 日
@ditie mysql 存储不是笑话... 代码明明很好实现你一定要数据库实现那就存储,游标吧
|
38
ditie OP @zander1024 真心求教下,这个“代码”是指什么,怎么个写法呢?我是真的不会呀
|
42
Alexhohom 2019 年 5 月 26 日
@ditie #40 想要分月度就 group by month 分部门就 group by department 同时 group by month,department
|
43
ditie OP @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 |
44
Alexhohom 2019 年 5 月 26 日
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 可以帮助你遍历你的查询 |
45
ditie OP @Alexhohom 完了,这两条我都没看明白 - -@ 。第一个点是用来实现什么效果的呢?第二个 count 我还是不懂是指什么,count(*) 这样的记录数?
|
46
Alexhohom 2019 年 5 月 26 日
@ditie #45 1. 就相当于 sql 里面的 if 语句, 如果考核表没有记录,那么 sum(kh.score)+100=100,发现这样的记录使其 total=-1。
2. 第二个就是你执行 query 后,没有报错会返回一个 result (我刚刚查的,没用过 nodejs ),result 中应该有 count 相关属性吧。result.count 这类的。 |
47
ditie OP @Alexhohom 嗯,第一点我知道 sql 这么写执行后的结果,但这个结果和我的需求没关系呀,还是不能分出百分比然后赋值;第二点这个返回的 result 不就是后台执行 sql 的结果么?你的意思是 sql 不动了、在前台用代码来实现分出百分比然后赋值的效果?然而这个前台的代码我也不会。。。
|
49
mmdsun 2019 年 5 月 26 日 via Android
最终显示效果是怎么样的?这样?
(月 score 部门,月 score 全体,绩效) |
50
xuanbg 2019 年 5 月 27 日
分 3 次操作就简单了呀,先不要管什么 ABC,把数据存进去。然后再把排序在前 20%的更新成 A,最后把倒序前 10%更新成 C。
楼上那些无脑查询让代码处理的,就没遇到过数据量太大导致磁盘 IO 和网络 IO 飞起么? |
51
DRcoding 2019 年 5 月 27 日
|
52
ratel 2019 年 5 月 27 日
可以增加另外的统计表,不建议太复杂的 SQL
|
54
ditie OP @mmdsun 是的,我想要的数据是结果是 月度,部门,员工 ID,score,部门内排名,绩效(根据部门内排名的百分比分布来给 ABC ),全公司排名
|
58
Beeethoven 2019 年 5 月 27 日
为什么一定要一个 sql 查出来呢,后台代码实现要简单很多而且性能高很多,一次把需要的数据全部查出来,然后分类输出就好了
|
59
Beeethoven 2019 年 5 月 27 日
java 的话就新建一个 examine 实体,department,date,userid,score 四个属性,再加一个 rank 来分类,根据条件查出来然后循环赋值 rank 给前端显示需要的结果。
插入到新表中就用代码 insert 回去就好了 |
62
tudouxiong 2019 年 5 月 27 日 via Android
窗口函数,需要 mysql 8 以后
|
63
LeeSeoung 2019 年 5 月 27 日
先查一遍总数 按分数倒序排 ,然后 case when 判断 rownum<total*0.2 则 A ……这样可以不
|
64
ditie OP @Beeethoven 是的,现在打算分步骤了,不打算一步到位。说实话,java 我一点都不会
|