`

狂魔型代码改造记

sql 
阅读更多
功能需求
   统计员工指定月:在职员工数,入职员工数,离职员工数,及前个月的员工数。

原有设计
   ■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; 
分享到:
评论
1 楼 Dog_Lee 2017-01-07  
您好,请问阁下会再写 spring4.0 就这么简单 一书吗? 您的读者。

相关推荐

    新贵狂魔二代鼠标驱动V1.03免费最新版

    新贵狂魔二代鼠标驱动是为新贵狂魔二代鼠标推出的很实用的专业驱动软件。新贵狂魔二代鼠标驱动可以帮助用户轻松修改该款鼠标参数,帮助鼠标更顺利运行,给用户带来更畅快的使用体验。这款新贵狂魔二代鼠标驱动能够为...

    微信HTML5在线朋友圈游戏源码带安装部署教程-打脸狂魔.zip

    "打脸狂魔"是游戏的名称,可能是一个互动性强、趣味性高的小游戏,旨在吸引用户参与并分享到朋友圈。"源码"意味着这个项目包含了游戏的编程代码,可以被开发者或对编程感兴趣的人研究和修改。"安装部署教程"则表示随...

    微信HTML5在线朋友圈游戏源码带安装部署教程-打脸狂魔.rar

    4. 代码上传:将本地的游戏源码上传到微信服务器,进行编译和预览。 5. 申请审核:提交游戏给微信审核,审核通过后才能在朋友圈发布。 6. 发布上线:审核通过后,发布游戏,用户即可在微信朋友圈中体验。 在开发...

    一些小游戏等代码

    【标题】"一些小游戏等代码"揭示了这个压缩包中包含的是与开发小游戏相关的源代码。这些游戏可能包括打地鼠、贪吃蛇等经典休闲娱乐项目。开发者可能在早期阶段编写了这些代码,用于学习编程技巧、游戏设计或者娱乐。...

    基于字节码的代码混淆加密工具

    基于字节码的代码混淆加密工具,使用方法见博客

    【团体程序设计天梯赛 往年关键真题 详细分析&amp;完整AC代码】搞懂了赛场上拿下就稳

    点赞狂魔排序 重排链表模拟链表 图着色问题简单图 部落并查集 小字辈递归 名人堂与代金券排序 秀恩爱分得快模拟 特立独行的幸福数学 冰岛人 深入虎六dfs 彩虹瓶栈 简单计算器栈 C罩发放模拟 完全二叉树的层序遍历树 ...

    “大国重器”与“基建狂魔”的2020年:新基建&各省市重点建设项目盘点精品报告2020.pdf

    “大国重器”与“基建狂魔”的2020年:新基建&各省市重点建设项目盘点精品报告2020.pdf

    【电赛经验分享】奖状是怎么炼成的-野生钢铁侠稚晖君的电赛狂魔之旅 .pdf

    稚晖君,一个电子竞赛狂魔,将他的参赛经验倾囊相授,希望能为参赛者提供宝贵的指导。 首先,赛前准备至关重要。不仅仅是技能的积累,心态的调整同样重要。电赛需要投入大量时间和精力,可能会牺牲一部分社交和休闲...

    “大国重器”与“基建狂魔”的2020年:新基建&各省市重点建设项目盘点精品报告2020.rar

    报告标题:“大国重器”与“基建狂魔”的2020年:新基建&各省市重点建设项目盘点精品报告2020 这份压缩包文件包含了一份详细的报告,着重介绍了2020年中国在基础设施建设和“新基建”领域的显著成就。中国的基础...

    熊猫头记仇日记生成器-crx插件

    洗澡狂魔倾情奉献,熊猫头记仇日记生成器,有啥仇你一起记吧! 熊猫头记仇日记生成器帮您把熊猫头和输入的文本内容合成一张图片功能下载,祝您斗图旗开得胜! 2018年05月17日 晴 今天出大太阳,工地上的砖头一如既往的烫手...

    设计公司整站源代码(适合学习)

    标题中的“设计公司整站源代码”指的是一个包含有完整设计公司网站的源代码资源,适合用于学习和参考。这通常意味着你将获得一个网站的所有前端和后端代码,包括HTML、CSS、JavaScript、PHP或其他服务器端语言,以及...

    Android-**记事本项目源代码

    【Android 记事本项目源代码详解】 在Android开发领域,构建一个记事本应用是一项常见的练习,也是学习Android基础知识的实用案例。标题中的“**记事本项目源代码”显然是一个Android应用的源码,可能包含了一个...

    病毒肆虐下,急诊室闯进一个宠姐“狂魔”

    【知识点】 1. 大龄产妇现象:随着二胎政策的开放,越来越多的高龄夫妇选择生育,这涉及到生理健康风险和社会伦理争议。 2. 家庭关系的影响:生育年龄差距较大的孩子可能会对家庭关系产生复杂影响,既有爱的延续,...

    新贵神器9号鼠标驱动程序v12.0.0.49974官方版

    新贵神器9号鼠标驱动是一款可以有效解决新贵神器9号鼠标在使用过程中出现的一些问题的驱动工具,本站提供了新贵神器9号鼠标驱动的下载地址,有兴趣的朋友们可以前来下载使用。 新贵神器9号鼠标的左右键采用一体式...

    android代码

    源代码是学习编程最直接的方式,通过阅读和实践这些代码,你可以理解Android应用程序的基本架构和工作原理。 首先,Android应用主要由四大组件构成:活动(Activity)、服务(Service)、广播接收器...

    28种CSS3炫酷loading页面加载动画特效代码

    本文将详细探讨28种CSS3实现的炫酷loading动画特效,以及如何在实际项目中应用这些代码。 一、CSS3基础 CSS3是层叠样式表的第三个版本,引入了许多新特性,如选择器、边框半径、渐变、阴影、动画和过渡等,为创建...

    1个积分的com.cb.eclipse.folding1.0.6.zip

    代码折叠是Eclipse中的一个重要特性,它允许开发者隐藏或“折叠”源代码中不相关的部分,如大段注释、方法体或者整个类,以使代码编辑窗口更加简洁,便于快速定位和理解关键代码。在Eclipse中,这一功能通常通过小的...

    云呼服务器源码php+APK

    云呼服务器源码php+APK (此源码去部分重要文件 不带数据库 仅供研究。)

    Python实现bilibili时间长度查询的示例代码

    说明:最近在B站看一些材料力学视频时候,感觉有一些分集狂魔的分集真的很恐怖,有的甚至上百集,因此决定写个小脚本每次分析下到底这个系列视频到底有多长。 好了,下面是分析过程: 第一步当然是打开一个视频 ...

Global site tag (gtag.js) - Google Analytics