sql server视图:从审核表中分配历史员工部门

d8tt03nd  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(259)

我正在创建sql server视图。我有一个时间管理系统的员工数据,每天打卡上班和下班,如下表所示,这只是一个例子,有100个员工记录。

DATE           USERID    CLOCK
--------------------------------
2020-02-25      1234    08:00:00
2020-02-25      1234    17:00:00

有一个部门和成本代码表,但它只保存当前部门和成本代码,没有历史记录。有一个如下所示的审计表,changedate是datetime格式的,还记录了进行更改的时间。

CHANGEDATE          USERID  CHANGETYPE  NEWVALUE
-------------------------------------------
2019-01-01 hh:mm:ss 1234    DEPARTMENT  Warehouse
2019-01-01 hh:mm:ss 1234    DEPARTMENT  Stores
2019-05-01 hh:mm:ss 1234    COSTCODE    Store1
2020-02-25 hh:mm:ss 1234    DEPARTMENT  Shipping
2020-02-25 hh:mm:ss 1234    COSTCODE    Dock1

我需要能够做的是将时间的部门和成本代码分配给打卡入/出数据,如下所示,这样我就可以看到在打卡日期分配给他们的部门和成本代码。使用上述时钟,员工1234在2019年5月1日至2020年2月25日期间分配的每个时钟都是department=stores和cost code=store1,2020年2月25日之前和之后的每个时钟都是department=shipping和cost code=dock1,以此类推。

DATE       USERID     CLOCK    DEPARTMENT   COSTCODE
-----------------------------------------------------
2020-02-24  1234    09:00:00    Stores      Store1
2020-02-24  1234    18:00:00    Stores      Store1
2020-02-25  1234    08:00:00    Shipping    Dock1
2020-02-25  1234    17:00:00    Shipping    Dock1

有人能帮忙吗?提前谢谢。

nhjlsmyf

nhjlsmyf1#

我将构建一个中间视图或cte,其中每个属性的开始日期和结束日期都有一个干净的历史记录,然后使用日期上的范围条件将其与时钟数据连接起来:

WITH changes_periods AS (
  SELECT
    c1.USERID,
    c1.CHANGETYPE AS ATTR_TYPE,
    c1.NEWVALUE AS ATTR_VALUE,
    c1.CHANGEDATE AS VALID_FROM,
    COALESCE(MIN(c2.CHANGEDATE), '20990101') AS VALID_BEFORE
  FROM changes c1
    LEFT JOIN changes c2 ON c1.USERID=c2.USERID AND c1.CHANGETYPE=c2.CHANGETYPE AND c1.CHANGEDATE<c2.CHANGEDATE
  GROUP BY c1.USERID,c1.CHANGETYPE, c1.NEWVALUE, c1.CHANGEDATE
)
SELECT
  c.DATE,
  c.USERID,
  c.CLOCK,
  dep.ATTR_VALUE as DEPARTMENT,
  cc.ATTR_VALUE as COSTCODE
FROM clockdata c
  LEFT JOIN changes_periods dep ON
    c.USERID=dep.USERID
    and dep.ATTR_TYPE='DEPARTMENT'
    and c.DATE>=dep.VALID_FROM and c.DATE<dep.VALID_BEFORE
  LEFT JOIN changes_periods cc ON
    c.USERID=cc.USERID
    and cc.ATTR_TYPE='COSTCODE'
    and c.DATE>=cc.VALID_FROM and c.DATE<cc.VALID_BEFORE

相关问题