【发布时间】:2019-12-12 08:43:12
【问题描述】:
背景资料:
我的公司要求员工在某个职位上至少持有一项认证 (cert)。员工总共可以获得 17 种不同的认证。
一名员工可以持有多个证书。但是在任何一天,他们都只能“坐”到他们获得认证的职位之一。大多数员工主要担任他们持有证书的最高级别职位,但如果该职位出现人员短缺,则可以担任较低级别的职位职位以及他们是否持有该特定证书(一些员工来找我们持有较高级别的证书,但没有较低级别的证书,因为他们让它们过期)。
多个员工可以持有同一个证书。
大约 90% 的员工签订合同,这意味着他们有固定的终止日期。合同可以延期,但为了这个 Access 数据库和要生成的报告,我们假定终止日期是一成不变的。
我的老板(和老板的老板)想要整理一份人力预测报告,这样他们就不会在我们开始缺乏任何一个职位的认证员工时措手不及。
他们想要的示例:
假设您有 3 名员工:
Employee1在position1、position2和position3拥有证书,但他主要以position3的身份任职,他的合同将于2020 年6 月到期。Employee2拥有position1和position2的证书,但主要以position2身份担任,她的合同将于 2022 年 2 月到期。Employee3是新的,于 2019 年 8 月到达,正在接受position1的培训,初始证书的最长允许培训时间为 3 个月,因此他应该在 2019 年 12 月之前获得position1证书,并且他的合同将于 2025 年 8 月到期。
假设我的老板想要预测 12 个月,起始月份是 2019 年 11 月(他只能选择等于或晚于当前月份年份的起始月份年份)。下面的图表是在子报表中生成的,应该是根据上述员工信息生成的。
所有认证图表
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| Cert | Nov 19 | Dec 19 | Jan 20 | Feb 20 | Mar 20 | Apr 20 | May 20 | Jun 20 | Jul 20 | Aug 20 | Sep 20 | Oct 20 |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| Position1 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 |
| Position2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 |
| Position3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
主要认证图表
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| Cert | Nov 19 | Dec 19 | Jan 20 | Feb 20 | Mar 20 | Apr 20 | May 20 | Jun 20 | Jul 20 | Aug 20 | Sep 20 | Oct 20 |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| Position1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Position2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Position3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
现在我已经有了一个解决方案,但它极其效率低下,并且涉及对每个单元格的查询(2 个图表 X 12 个月 X 17 个职位 = 生成报告时的 408 个查询)。我希望通过交叉表查询做一些更有效的事情。
表格是这样设置的(仅列出相关字段):
Emp_table
-
ID(自动编号) -
contractStarted(日期) -
contractEnd(日期)
Cert_individual
-
ID(自动编号) -
certID(num, many->一个关系到cert_table.ID) -
EmpID(num, many->一个关系到Emp_table.ID) -
date_cert_received(日期) -
primary(是/否)
cert_table
-
ID(自动编号) -
cert_name(短文)
显然我需要做几个INNER JOINS 才能将所有内容放在一起,我尝试使用this website 中的格式进行交叉表查询,但它只会在当月的计数中添加一个单独的证书- 员工收到证书的年份,而不是员工持有证书的每个月。
所以我的问题是:
SQL 或 VBA 中是否有一种方法可以根据员工收到证书的时间以及合同计划终止的时间来跨多个列(月-年)计算证书?
【问题讨论】:
-
答案是:大多数事情都可以用足够多的代码和不止一种方法来完成。您已经有了一种仅使用 SQL 的方法,但是结合使用 SQL 和 VBA 以及临时表可能会更有效。以某种方式生成所有可能的月-年/员工对的数据集当然是可能的,但我只是怀疑。
-
更正,需要所有可能的月-年/员工/证书组合的数据集来作为 CROSSTAB 的基础。编辑问题以显示源数据表的示例。
-
How to ask a good SQL question。示例数据和预期结果比文字描述更有用。
标签: sql ms-access crosstab ms-access-2016