Есть ли способ выбрать строки в базе данных в день? - PullRequest
0 голосов
/ 09 января 2019

Мне нужно создать запрос sql, который возвращает сотрудников с 0 отсутствием и с 0 часами работы в день между интервалами, выбранными пользователем. Я получил мое представление v_personnel (строки о сотрудниках), exp_mat_abs (строки об отсутствии моего сотрудника) и exp_mat_mo (строки о рабочих часах сотрудников). Я застрял. Я не могу найти способ, как я могу получить сотрудников с 0 отсутствием и с 0 часами работы в день между интервалами, выбранными пользователем. Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 09 января 2019

Таким образом, у вас есть запись в таблице сотрудников для каждого сотрудника, но не будет записей в отработанные часы или часы, если неработающий сотрудник не отсутствовал. Помимо небольшого противоречия в том, как кто-то может не работать, но и не отсутствовать :) (я полагаю, вы имеете в виду, что они заключают какую-то сделку без работы и без оплаты), что вы хотите -

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 ...

Если вы этого не сделаете, то несколько строк из одной из них на сотрудника приведут к дублированию данных из другой таблицы

Edit; поэтому вам нужно несколько дополнительных дней на одного сотрудника:

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-м и присоединить к нему сотрудников. Это дает нам вещь для каждого сотрудника в день. Теперь мы можем присоединиться к нашим часам и отсутствию на этом и получать часы, отработанные в день (или ноль, если они не работали), и пропуски в день (или ноль, если они не отсутствовали)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...