ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2027|回复: 5

一个关于职称的数据库设计及处理问题求解

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-4-19 22:52 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
在一个人事管理库里,打算建立一个技术职务(也就是常说的“职称”)的表,记录所有员工的职称经历。
比如结构及一个职工的内容如下:

职工号,职称(记录的是代码),任职时间(日期)
001,124(表示助理经济师),1995-8-1
001,123(经济师),1999-8-1
001,124,2004-8-1
001,123,2010-8-1

大致意思就是:职工001,1995年评初级,1999年评中级,2004年因为调动工作低靠认成初级,2010年平反恢复中级。

在统计中往往需要得到一些数据。
如果是需要现在的状态,则要得到,现在的职称是123,真实任职时间是1999-8-1,扣去低靠的6年可以推算出一个虚拟的连续任职时间是2005-8-1;如果是需要得到2009年时的状态,则要得到,当时的职称是124,真实任职时间是1995-8-1,扣去中间作为124的5年可以推算出一个虚拟的连续任职时间是2000-8-1。
这些用手工计算很容易理解,不加字段、仅以我给出的这些条件数据也足以得出这些想要的结果数据,但我不知道怎样用SQL得出想要的结果。
这不是作业,是个真实的应用,从表的设计到查询语句等等方面都欢迎给出建议。为了简便,不一定要写出完整无误的SQL语句,只要能表达出实用的思路即可。谢谢。

TA的精华主题

TA的得分主题

发表于 2011-4-19 23:56 | 显示全部楼层
做个记号。再来学习。

TA的精华主题

TA的得分主题

发表于 2011-4-19 23:57 | 显示全部楼层
select top 1 * from table where 任职时间<= 时间变量 order by 任职时间 desc    这样可以得到职务状态。
但你讲的那个“连续任职时间”实在是没看明白怎么回事。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-20 00:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 marco 于 2011-4-19 23:57 发表
select top 1 * from table where 任职时间

我只举的是一个员工的例子,实际用时会放多个员工的职称经历,我觉得应该会用到group by来分别得到每个人数据。不过这个容易解决,主要是搞不懂怎样在记录的简单化和查询的复杂化之间找到个平衡。
本来人事机构的管理上有个“连续工龄”这么个概念,是为了描述工龄出现空档的人。比如有人1950年参加工作,他的参加工作时间本该算1950,但他1966到1976年没有工作记录,无法证明他在某单位工作,那么他的工龄就要被扣去10年。为了便于计算,人事部门就把他参加工作的时间虚推至1960,这个1960就被称作连续工龄。和“工龄”不同,“连续工龄”是指虚推出的参加工作时间,不是年数。当普通报表时填真正的参加工作时间1950,当计算待遇相关内容时通常就要用连续工龄1960。
所谓“连续职龄”,是我从连续工龄上借鉴过来的概念。因为事业单位的职称是名额制,不像企业那样够格的都上,所以经常会发生调动低靠,导致一个人的职称产生波动或是说出现断层,企业应该少见。比如说有人2000年评了中级,2003年因故调来本单位套成初级,直到2005年才占了职称指标恢复成中级,那么本来是2000年评的中级,却出现了2年的空档。按照“连续工龄”的思路,他也会有个“连续职龄”2002。
人事上的概念很复杂,我也不专业,说起来很啰嗦。这么晚还在为我解答,辛苦了。

TA的精华主题

TA的得分主题

发表于 2011-4-20 10:44 | 显示全部楼层
这是一个方法,不完整,但大体思路已经具备,至于两种以上职称的调整估计也能实现,具体由你自己去完善吧。

SELECT a.*,(select max(b.任职时间) from tb b where b.任职时间<a.任职时间 and b.职工号=a.职工号) as 上次调整时间
FROM tb a

职工号        职称        任职时间        上次调整时间
001        124        1995/8/1       
001        123        1999/8/1        1995/8/1
001        124        2004/8/1        1999/8/1
001        123        2010/8/1        2004/8/1

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-21 22:26 | 显示全部楼层
根据适当加段的思路,我想了个进一步简化查询的方案:
职工号,职称,任职时间,初始任职时间,扣除年限
001,124,1995/8/1,1995/8/1,0
001,123,1999/8/1,1999/8/1,0
001,124,2004/8/1,1995/8/1,5
001,123,2010/8/1,1999/8/1,6
多加了初始任职时间和扣除年限。不管哪次变动,初始任职时间都是他第一次评相应级别的日期,初级是1995/8/1,中级是1999/8/1。扣除年限是在每次职称变动时,由人工计算出从首次评上这个级别到恢复成这个级别之间的不在这个级别的年数填写上,这个数值在下次发生变动之间都是不变的。
这样只要根据统计日期的规定,得到早于这个日期的最晚日期,再得到这一行上的所有数据,就能根据每次统计的需要,得到想要的职称、初始任职时间、有效任职时间等信息了。
如果上述成立,我再慢慢考虑能否只从前三个字段来计算生成五个字段的中间查询,再由这个中间查询得出最终想要的结果,从而尽量简化数据的维护。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-11 16:52 , Processed in 0.020049 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表