#sql #sql-server #join
#sql #sql-сервер #Присоединиться
Вопрос:
У меня есть две независимые таблицы: tbl_timesheet и tbl_absence. tbl_timesheet будет содержать строку каждый день, когда сотрудник входит в систему. tbl_absence — это одна строка для уникального экземпляра отсутствия, когда сотрудник не работает. Каждая таблица выглядит так:
tbl_timesheet:
Staff_ID DEPT LOG_DATE
001 IT 2020-09-01
002 HR 2020-09-01
003 SALES 2020-09-01
001 IT 2020-09-02
002 HR 2020-09-02
003 SALES 2020-09-02
001 IT 2020-09-03
002 HR 2020-09-03
003 SALES 2020-09-03
tbl_absence:
Staff_ID ABSENCE_DATE
001 2020-09-10
003 2020-09-15
003 2020-09-22
Я хочу объединить две таблицы, где я могу подсчитать случаи отсутствия. Я попытался сделать это, используя следующий скрипт:
SELECT t.Staff_ID as ID, t.DEPT as Dept, COUNT(a.Staff_ID) as 'Instances'
FROM tbl_timesheet t
JOIN tbl.absence a
ON t.Staff_ID = a.Staff_ID
GROUP BY t.Staff_ID, t.DEPT
Я бы ожидал следующего:
ID Dept Instances
001 IT 1
003 SALES 2
Однако из-за соединения между таблицами я считаю, что Staff_ID дублируется, потому что каждый из них появляется несколько раз в tbl_timesheet.
Есть предложения?
Комментарии:
1. У вас должна быть отдельная таблица для хранения отдела каждого сотрудника, а не дублировать информацию в каждой строке расписания.
Ответ №1:
когда вы ОБЪЕДИНЯЕТЕ две таблицы перед получением различных значений Staff_Id и Dept, это умножит количество записей. например, staff_id= ‘003’ 2 записи из таблицы отсутствия умножьте 3 записи из расписания, и вы получите 6 записей.Поэтому вы можете закодировать, как показано ниже.
SELECT
t.Staff_ID as ID,
t.DEPT as Dept,
-----------
COUNT(a.Staff_ID) as Instances
-----------
FROM tbl_absence a
JOIN (select distinct Staff_ID, DEPT FROM tbl_timesheet) t
ON t.Staff_ID = a.Staff_ID
GROUP BY t.Staff_ID, t.DEPT