У меня возникли проблемы со значениями COUNT () при объединении таблиц SQL

#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