有没有办法每天选择数据库中的行?

时间:2019-01-09 10:41:55

标签: sql postgresql

我必须创建一个sql请求,该请求将返回缺勤时间为0且每天在用户选择的时间间隔内工作0个小时的员工。我得到了视图v_personnel(关于雇员的行),exp_mat_abs(关于我的雇员缺席的行)和exp_mat_mo(关于雇员的工作时间的行)的视图。我被困住了。我找不到如何在用户选择的时间间隔之间让员工缺勤0天,每天工作0个小时的方法。 有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

因此,您在雇员表上有每位雇员的记录,但是如果没有缺勤的雇员,则没有工作时间或缺勤时间的记录。除了在某人无法工作但又不缺席方面存在一点矛盾之外:)(我想你是说他们正在做某种“不劳不劳”的交易)

employees 
left join hoursworked on ... 
left join absent on ...

缺勤/小时数为零的员工在每个小时/缺勤表的每一列中都为NULL

如果您只想要这些员工,就可以

WHERE hoursworkedtable.primarykeycolumnname IS NULL

如果要将空值转换为零,可以:

SELECT COALESCE(somenullcolumn, 0) as somenullcolumn

我要指出的唯一另一件事是工作时间和缺勤时间不一定是相关的概念-您可能希望将其归类为例如一段时期,然后再加入该员工并加入该员工,而当天也,否则您最终将获得笛卡尔积-基本上可以找到某种方法来减少来自工作表和缺勤表的行,因此在加入之前,每个员工(每个时间段)只有一行。

employees 
left join (select ... from hoursworked group by...) on ... 
left join (select ... from absent group by...)  on ...

如果不这样做,那么每位员工来自其中任一行的多行将导致另一个表中的数据重复

编辑;因此,每位员工需要多花些时间:

employee e
cross join
generate_series('2019-01-10'::timestamp, '2019-01-21'::timestamp, '1 day'::interval) d
left outer join (select emp, thedate, ... from hoursworked group by emp, thedate) w
on w.empid = e.empid and w.thedate = d.d
left outer join (select emp, thedate, ... from absent group by emp, thedate) a
on a.empid = e.empid and a.thedate = d.d

我们要求generate_series为我们提供10号和21号之间的日期列表,并将员工加入其中。这为我们提供了每天每位员工的服务。现在我们可以将我们的工作时间和缺勤情况加入其中,并获得每天工作的小时数(如果不工作则为零)和每天的工作时间(如果不缺勤则为零)