首页 > 解决方案 > 动态表创建 SQLSever

问题描述

我在 SQL 服务器中有几个表,其中包含员工数据,包括 ID 和时钟时间。我需要创建一个报告来显示每个员工每天的打卡时间。我已经用下面的代码做到了这一点。但是,由于只有在有条目时才会记录打卡时间,所以我需要显示没有员工打卡记录的工作日。我曾考虑在 2019/2020 年制作一张工作日表,其中包括每位员工每天的数据并使用它来加入,但是当有人开始新工作时,该表需要不断更新。

表格有什么办法可以用员工编号更新自己并复制工作日?

任何帮助,将不胜感激

谢谢

select distinct cast(a.DET_NUMBER as varchar) as 'Frontier ID',
    e.CDN_CARD_ID,
    CONCAT (a.DET_G1_NAME1, ' ', a.DET_SURNAME) as 'Name',
    c.POS_TITLE as 'Position',
    c.POS_L3_CD as 'Department',
    c.POS_L4_CD as 'Department 2',
    cast(a.DET_DATE_JND as date) as 'Start Date',
    cast(b.TER_DATE as date) as 'Leaving Date',
    CONCAT (d.DET_G1_NAME1, ' ', d.DET_SURNAME) as 'Team Manager',
    f.CLO_DATE2,
    min(CLO_TIME2) over (partition by f.CLO_DATE2, e.CDN_CARD_ID) as earliest_time,
    max(CLO_TIME2) over (partition by f.CLO_DATE2, e.CDN_CARD_ID) as latiest_time
from EMDET a
left outer join EMTER b on a.DET_NUMBER = b.DET_NUMBER
left outer join EMPOS c on a.DET_NUMBER = c.DET_NUMBER
left outer join EMDET d on c.POS_MANEMPNO = d.DET_NUMBER
left outer join TACDN e on a.DET_NUMBER = e.DET_NUMBER
left outer join TACLO f on e.CDN_CARD_ID = f.CLO_CARD_NO
Where (b.TER_DATE is null or c.POS_END>=GETDATE())
  and c.POS_TITLE is not null
  and (c.POS_END<=Cast('1992-01-01' as datetime) or c.POS_END>=GETDATE())
  and f.CLO_DATE >='2019-01-01'
order by [Team Manager] asc,
         e.CDN_CARD_ID asc,
         f.CLO_DATE2 asc

标签: sql-server

解决方案


您可以使用 CTE 生成日历

DECLARE @Start DATE = '2018-1-1', @End DATE = GETDATE()
;WITH 
dates AS
(
    SELECT thedate = @Start
    UNION ALL
    SELECT dateadd(day,1,dates.thedate)
    FROM dates
    WHERE dateadd(day,1,dates.thedate) <= @End
)
SELECT * 
FROM dates c
OPTION (maxrecursion 0);

然后过滤以排除非工作日(周末:直接在您的查询中,假期,假期,许可证等来自其他表)

与您的实际查询左连接


推荐阅读