Как включить данные из объединенной таблицы, которая не соответствует условию WHERE, в качестве нулевого значения (SQL) - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть 2 таблицы сотрудников и отпуск по болезни, которые связаны с идентификатором сотрудника, и в основном таблица медицинских отпусков будет содержать несколько данных об одном сотруднике, который берет несколько отпусков. Я хочу отфильтровать данные по месяцумедицинский отпуск и включает сотрудников, чей медицинский отпуск не указан в отфильтрованном месяце, в качестве нулевого значения.

       EMPLOYEES                  MEDICAL
    |employee|ID|             |ID|DateOfLeave|
         A     1                1   2019/1/3
         B     2                1   2019/4/15
         C     3                2   2019/5/16
         D     4

Выражение sql, которое я придумал, фильтрует конкретный месяц отпуска и подсчитывает количествоесли в этот месяц они брали отпуск, например, в январе, в него также входят сотрудники, у которых нет отпуска в виде «0», однако сотрудники, у которых есть медицинские отпуска, которых нет в январе, вообще не отображаются в наборе результатов, какМогу ли я показать им 0 медицинских листов в январе месяце?

select employees.employee, employees.ID,
 count(medical.DateOfLeave) as NumberOfLeaves
from employees
left outer join medical on employees.ID = medical.ID
where (MONTH(DateOfLeave) = 1) or (medical.DateOfLeave is null)
group by employees.employee,employees.ID
           RESULT SET
    |Employee|ID|NumberOfLeaves|
        A      1      1
        C      3      0   
        D      4      0

Как вы можете видеть, B исчезает, но я хочу, чтобы он отображался в наборе результатов как '0', каксотрудник C и D

Я знаю это, потому что медицинские данные сотрудника B не соответствуют условиюздесь, но как мне написать заявление, которое включает сотрудников, у которых есть медицинские отпуска, которых нет в январе в результате, установленном как 0 ??

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

левое внешнее объединение сначала соединит таблицу, а затем отфильтрует.в вашем случае B не входит в само соединение, поэтому фильтр не работает.Вы можете попробовать это

select employees.employee, employees.ID,
 nvl(count(medical.DateOfLeave),0) as NumberOfLeaves
from employees
left outer join (select * from medical 
where (MONTH(DateOfLeave) = 1)) 
on employees.ID = medical.ID
group by employees.employee,employees.ID

или вы также можете попробовать это

   select e.id, employee, count(dateofleave)
from employee e, medical m
where e.id = m.id
and month(m.DateOfLeave) = 1
group by e.id, employee
UNION ALL
select id, employee, 0
from employee e
where not exists(select 1 from medical m
where e.id = m.id
and month(m.DateOfLeave) = 1
0 голосов
/ 05 апреля 2019

Ваш запрос показывает результаты только для сотрудников, уволившихся в январе или не имеющих отпуска вообще.

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

Чтобы сделать это, вам нужно изменить условие для вашего объединения, включив в него фильтр месяца.

Вотрабочий пример с использованием табличных переменных

DECLARE @Employees TABLE (ID INT, Employee CHAR(1))
DECLARE @Medical TABLE (ID INT, DateOfLeave DATE)

INSERT INTO @Employees
VALUES (1, 'A'), (2,'B'), (3,'C'), (4, 'D')

INSERT INTO @Medical 
VALUES (1, '2019-01-03'), (1, '2019-04-15'), (2, '2019-05-16')

SELECT          e.employee, 
                e.ID,
                count(m.DateOfLeave) AS NumberOfLeaves
FROM            @Employees e
LEFT OUTER JOIN @Medical m ON   e.ID = m.ID AND MONTH(DateOfLeave) = 1
GROUP BY        e.employee,e.ID
...