表格详细解释如下:
我有3张桌子:
表A :
它作为有关员工信息的主表。
表B :
它用作存储所有员工的表。对于已经报告生病或正在休假或有怀孕假的员工,以及不可用的员工的底线
表C:
它作为一个表格,其中存在员工的原始数据。例如,我们将组织的时间表作为事件传播,第一个事件是早晨时间会议,第二个是静音工作时间,第三个是头脑风暴会议等。现在,如果员工因特定事件而被免除,则会在此处输入。
此处EmployeeID
和ExcusedForEventCode
都是复合主键,因为多个借口可能会有相同的employeeId
,但组合始终是唯一的。
我们已经建立了一些自定义考勤管理系统,需要以下详细信息:
我们需要找到所有那些既没有考虑也没有为特定事件辩解的员工(这将通过前端提供)持续一段时间从前端选择。
上述查询的结果随后将用于与生物识别考勤机日志进行比较
EmployeeId|LogDate(datetime)|EventCodes
作为我们数据库的单独表输入(主表一个employeeId将此EmployeeId作为外键引用)
将比较它以找出特定事件的真正缺席者。即所有那些既没有考虑也没有任何特定事件的借口以及在生物识别扫描机日志中没有弄清楚的员工在所选择的持续时间内都没有。我们需要像EmployeeId|Employee Designation|Employee Name|EventName (have a separate table linking with EventCode)|Date&time
这样的缺席者输出(这将是每个每个活动报告的员工在选定的持续时间内缺席)。
我们尝试了类似的查询:
select
employeemastertable.employeeid,
employeemastertable.Designation,
employeemastertable.Name,
EventCodes.EventCodeName as Eventexcusedfrom
from
employeemastertable
inner join
employeeexcusedforevents on employeemastertable.employeeid = employeeexcusedforevents.employeeid
inner join
EventCodes on employeeexcusedforEvents.ExcusedForEventCode = EventCodes.Eventcode
left join
employeeaccountedFor on employeemastertable.employeeid = employeeaccountedFor.employeeid
where
employeeexcusedforevents.ExcusedForEventCode != 1 (Morning conference)
and employeeaccountedFor.employeeid is null;
名称已更改
我明白这会给那些在早上会议中没有弄清楚的员工,但是即使我离开了join而不是在employeemastertable和employeeexcusedForevents之间的内部联接,并且把employeeexcusedforevents.excusedforeventcode为null而且employeeexcusedforevents.employeeid为null,I确保所有那些不在另外两个表中的员工,但不满足事件的标准。这意味着如果员工在第二次活动以及组织中被免责。我将如何满足上述代码中的要求? (PS这只是我理解的等式的第一部分,在此之后我还需要其他部分的帮助,其中持续时间和与日志相比)?
答案 0 :(得分:0)
我假设表EventCodes中的EventCode = 1只有一行。下面我将想要的事件交叉加入员工主表,然后排除任何原谅或解释的员工。
-- employees neither accounted for nor excused for a specific event
SELECT
em.employeeid
, em.Designation
, em.Name
, ec.EventCodeName AS Eventexcusedfrom
FROM employeemastertable em
CROSS JOIN (
SELECT Eventcode, EventCodeName
FROM EventCodes
WHERE Eventcode = 1
) ec
WHERE NOT EXISTS (
SELECT NULL
FROM employeeexcusedforevents ee
WHERE em.employeeid = ee.employeeid
AND ec.Eventcode = ee.ExcusedForEventCode
)
AND NOT EXISTS (
SELECT NULL
FROM employeeaccountedFor eaf
WHERE em.employeeid = eaf.employeeid
)
;