Sql 如何在交叉表查询的多列中计算记录? 背景资料:

Sql 如何在交叉表查询的多列中计算记录? 背景资料:,sql,ms-access,crosstab,ms-access-2016,Sql,Ms Access,Crosstab,Ms Access 2016,我的公司要求员工在一个职位上至少持有一份证书。员工总共可以获得17种不同的认证 一名员工可以持有多个证书。但在任何一天,他们只能“坐”一个他们被认证的职位。大多数员工主要担任他们持有证书的最高级别职位,但如果该职位人员短缺,并且他们持有特定证书,则可以担任较低级别的职位(有些员工持有较高级别的证书,但没有较低级别的证书,因为他们让证书过期) 多个员工可以持有同一证书 大约90%的员工是合同员工,这意味着他们有一个固定的终止日期。合同可以延长,但是为了这个Access数据库和要生成的报告,我们假设

我的公司要求员工在一个职位上至少持有一份证书。员工总共可以获得17种不同的认证

  • 一名员工可以持有多个证书。但在任何一天,他们只能“坐”一个他们被认证的职位。大多数员工主要担任他们持有证书的最高级别职位,但如果该职位人员短缺,并且他们持有特定证书,则可以担任较低级别的职位(有些员工持有较高级别的证书,但没有较低级别的证书,因为他们让证书过期)

  • 多个员工可以持有同一证书

  • 大约90%的员工是合同员工,这意味着他们有一个固定的终止日期。合同可以延长,但是为了这个Access数据库和要生成的报告,我们假设终止日期是固定不变的

  • 我的老板(和老板的老板)想要编制一份人员配置预测报告,这样他们就不会在我们开始缺少任何一个职位的认证员工时措手不及

    他们想要什么的例子: 假设您有三名员工:

    • 员工1
      拥有
      职位1
      职位2
      职位3
      的证书,但他主要担任
      职位3
      ,合同于2020年6月到期

    • 员工2
      拥有
      职位1
      职位2
      的证书,但主要担任
      职位2
      ,其合同将于2022年2月到期

    • 员工3
      是新员工,于2019年8月抵达,正在接受培训以获得
      职位1
      ,初始证书的最长允许培训时间为3个月,因此他大概应在2019年12月之前获得
      职位1
      证书,其合同将于2025年8月到期

    假设我的老板希望规划12个月,起始月为2019年11月(他只能选择一个等于或晚于当前月份的起始月份)。下面的图表是在子报告中生成的,应该是从上述员工信息中生成的

    所有认证表
    +-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    |证书| 11月19日| 12月19日| 1月20日| 2月20日| 3月20日| 4月20日| 5月20日| 6月20日| 7月20日| 8月20日| 9月20日| 10月20日|
    +-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    |位置1 | 2 | 3 | 3 | 3 | 3 | 2 | 2 | 2|
    |位置2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 1|
    |位置3 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0|
    +-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    
    初级证书表
    +-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    |证书| 11月19日| 12月19日| 1月20日| 2月20日| 3月20日| 4月20日| 5月20日| 6月20日| 7月20日| 8月20日| 9月20日| 10月20日|
    +-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    |位置1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1|
    |位置2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1|
    |位置3 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0|
    +-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    
    现在我已经有了一个解决方案,但它效率极低,并且涉及到每个单元格的查询(生成报告时,2个图表X 12个月X 17个位置=408个查询)。我希望通过交叉表查询做一些更有效率的事情

    表的设置如下(仅列出相关字段):

    Emp_表

    • ID
      (自动编号)
    • 合同开始
      (日期)
    • 合同结束
      (日期)
    证书个人

    • ID
      (自动编号)
    • certID
      (num,多个->与
      cert\u table.ID的一个关系
    • EmpID
      (num,多个->与
      Emp\u table.ID的一个关系
    • 收到证书的日期
      (日期)
    • 主要
      (是/否)
    证书表

    • ID
      (自动编号)
    • 证书名称
      (短文本)
    显然,我需要做几次
    内部连接
    ,以便将所有内容整合在一起,我尝试使用中的格式进行交叉表查询,但它只会将单个证书添加到员工收到证书的月份年份的计数中,而不会添加到员工持有证书的每个月

    所以我的问题是:
    在SQL或VBA中,有没有一种方法可以根据员工收到证书的时间以及他们的合同计划何时终止来获取跨多个列(月-年)计数的证书?

    据我所知,获取交叉表查询的主要问题是,它只能生成包含您已有数据的列

    获取月度列的一个简单解决方案是,有一个包含12个日期的边表,然后使用笛卡尔积为每个列生成月度数据