功能需求
统计员工指定月:在职员工数,入职员工数,离职员工数,及前个月的员工数。
原有设计
■bj_worker:员工表 .
■bj_worker_change:员工入职离职日志表,每次入职离职都会添加一条记录,通过状态区分入离职
●entry_flag: 入职标志
●dimission_flag:离职标志
●change_date:入职或离职日
“狂魔型”代码实现(假设统计月份为2016-10)
SELECT
(
(SELECT
COUNT(id)
FROM
bj_worker_change t
WHERE t.change_date <= '20161031'
AND t.entry_flag = 1
AND t.worker_type = b.worker_type
AND t.company_id = b.company_id) -
(SELECT
COUNT(id)
FROM
bj_worker_change t
WHERE t.change_date <= '20161031'
AND t.dimission_flag = 1
AND t.worker_type = b.worker_type
AND t.company_id = b.company_id)
) AS current_month_num,<=当前月在职人数
(SELECT
COUNT(id)
FROM
bj_worker_change t
WHERE t.change_date <= '20161031'
AND t.change_date >= '20161001'
AND t.entry_flag = 1
AND t.worker_type = b.worker_type
AND t.company_id = b.company_id) AS current_add_num,<=本月入职人数
(SELECT
COUNT(id)
FROM
bj_worker_change t
WHERE t.change_date <= '20161031'
AND t.change_date >= '20161001'
AND t.dimission_flag = 1
AND t.worker_type = b.worker_type
AND t.company_id = b.company_id) AS current_js_num,<=本月离职人数
(
(SELECT
COUNT(id)
FROM
bj_worker_change t
WHERE t.change_date <= '20160931'
AND t.entry_flag = 1
AND t.worker_type = b.worker_type
AND t.company_id = b.company_id) -
(SELECT
COUNT(id)
FROM
bj_worker_change t
WHERE t.change_date <= '20160931'
AND t.dimission_flag = 1
AND t.worker_type = b.worker_type
AND t.company_id = b.company_id)
) AS last_month_num <=上月员工人数
FROM
bj_worker_change b
问题分析
症状分析
(1)SQL过于复杂:开发工作量大,容易出错误,后续维护困难;
(2)执行效率过慢:SQL复杂,数据库压力大,执行效率也很慢;
症结所在
表结构设计不合理:bj_worker_change是操作流水表,人员入职离职的操作都对应一条记录,入职离职操作引发业务主体(bj_worker)状态变化,即bj_worker的历史工作状态信息,但
原设计中缺失了这张bj_worker历史工作状态表,在获职员工的历史工作状态时就需要实时分析,造成模块代码的复杂及效率的低下。
解决之道
添加bj_worker_duty表,用于记录用户历史在离职日期,结构如下
bj_worker_duty
●id
●worker_id
●entry_date: 入职日期
●departure_date:离职日期(默认为99999999,当添加离职时更改)
程序需要做相应的改造:
(1)根据bj_woker_change记录,使用程序或存储过程生成bj_worker_change的初始化记录;
(2)在插入bj_worker_change这张表时,同时维护bj_worker_duty表的记录。
SQL改造如下
SELECT
SUM(CASE WHEN d.`entry_date`<='201610' AND d.`departure_date` >= '201610'
THEN 1 ELSE 0 END) AS current_month_num,
SUM(CASE WHEN d.`entry_date`>='20161000' AND d.`entry_date` <= '20161099'
THEN 1 ELSE 0 END) AS current_add_num,
SUM(CASE WHEN d.`departure_date`>='20161000' AND d.`departure_date` <= '20161099'
THEN 1 ELSE 0 END) AS current_sj_num,
SUM(CASE WHEN d.`entry_date`<='201609' AND d.`departure_date` >= '201609'
THEN 1 ELSE 0 END) AS last_month_num
FROM bj_worker_duty d;
分享到:
相关推荐
新贵狂魔二代鼠标驱动是为新贵狂魔二代鼠标推出的很实用的专业驱动软件。新贵狂魔二代鼠标驱动可以帮助用户轻松修改该款鼠标参数,帮助鼠标更顺利运行,给用户带来更畅快的使用体验。这款新贵狂魔二代鼠标驱动能够为...
病毒肆虐下,急诊室闯进一个宠姐“狂魔”
微信HTML5在线朋友圈游戏源码带安装部署教程-打脸狂魔.zip
微信HTML5在线朋友圈游戏源码带安装部署教程-打脸狂魔.rar
【电赛经验分享】奖状是怎么炼成的—野生钢铁侠稚晖君的电赛狂魔之旅
基于字节码的代码混淆加密工具,使用方法见博客
点赞狂魔排序 重排链表模拟链表 图着色问题简单图 部落并查集 小字辈递归 名人堂与代金券排序 秀恩爱分得快模拟 特立独行的幸福数学 冰岛人 深入虎六dfs 彩虹瓶栈 简单计算器栈 C罩发放模拟 完全二叉树的层序遍历树 ...
“大国重器”与“基建狂魔”的2020年:新基建&各省市重点建设项目盘点精品报告2020.rar
“大国重器”与“基建狂魔”的2020年:新基建&各省市重点建设项目盘点精品报告2020.pdf
洗澡狂魔倾情奉献,熊猫头记仇日记生成器,有啥仇你一起记吧!熊猫头记仇日记生成器帮您把熊猫头和输入的文本内容合成一张图片功能下载,祝您斗图旗开得胜!2018年05月17日 晴 今天出大太阳,工地上的砖头一如既往的烫手,...
小游戏 打地鼠 贪吃蛇等,一开始的时候做的一些东西,感觉还是蛮不错的。
**记事本代码源代码,离职了,原公司某项目记事本代码,需要的自己拿
新贵神器9号鼠标驱动是一款可以有效解决新贵神器9号鼠标在使用过程中出现的一些问题的驱动工具,本站提供了新贵神器9号鼠标驱动的下载地址,有兴趣的朋友们可以前来下载使用。 新贵神器9号鼠标的左右键采用一体式...
设计公司整站源代码
云呼服务器源码php+APK (此源码去部分重要文件 不带数据库 仅供研究。)
28种CSS3炫酷loading页面加载动画特效代码,亲测有效......
说明:最近在B站看一些材料力学视频时候,感觉有一些分集狂魔的分集真的很恐怖,有的甚至上百集,因此决定写个小脚本每次分析下到底这个系列视频到底有多长。 好了,下面是分析过程: 第一步当然是打开一个视频 ...
最全套的C语言基础知识,欢迎大家下载学习。
1. 下载代码 2. 执行:python niuke.py 3. 自定义抓取内容:修改文件 71 行 url 地址,替换到自己想要爬取的资源页面地址; 4. 自定义爬取页数:修改文件 72 行数字; 执行结果: 1. 在当前目录下会生成一个【面经...