Отчет о посещаемости SQL Server 2008 за каждый день месяца - PullRequest
0 голосов
/ 16 января 2019

У меня есть две таблицы, одна называется ATTENDANCE, а другая - DATES.

В ATTENDANCE у меня есть такие строки:

Name | when       | Entry | Exit 
-----+------------+-------+------
Bob  | 2019-01-02 | 08:00 | 16:00
Bob  | 2019-01-04 | 09:00 | 17:00
Bob  | 2019-01-05 | 07:00 | 13:00

и в таблице DATES

DATE
----------
2019-01-01
2019-01-02
2019-01-03
...

Мне нужен такой отчет при выборе Боба для месяца январь:

date       | entry | exit
-----------+-------+-----
2019-01-01 | null  | null
2019-01-02 | 08:00 | 16:00
2019-01-03 | null  | null
2019-01-04 | 09:00 | 17:00
2019-01-05 | null  | null
2019-01-06 | 07:00 | 13:00
2019-01-05 | null  | null
...

Я пытался с левым соединением так:

select date, entry, exit 
from DATES
left join ATTENDANCE on date = when 
where name = 'Bob' 
  and month(date) = (select month('2019-01-01'))

Но я получаю только это:

 2019-01-02 | 08:00 | 16:00
 2019-01-04 | 09:00 | 17:00
 2019-01-05 | 07:00 | 13:00

Может кто-нибудь помочь мне?

Спасибо С уважением

Ответы [ 2 ]

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

Вы можете использовать левое соединение и добавить условие фильтра в предложение ON

select d.date,a.entry,a.exit 
from DATES d 
left join ATTENDANCE a on a.date = d.date 
  and d.name = 'Bob' and MONTH (d.date) =  MONTH('2019-01-01')

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

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

Вы рядом. Вам просто нужно переместить фильтрацию на втором столе в условие on:

select d.date, a.entry, a.exit
from DATES d left join
     ATTENDANCE a
     on d.date = a.when and a.name = 'Bob' 
where MONTH(d.date) = MONTH('2019-01-01') and
      YEAR(d.date) = YEAR('2019-01-01')

Примечания:

  • Использовать псевдонимы таблиц. Рекомендуемые псевдонимы - это аббревиатуры для названия таблицы.
  • Укажите все имена столбцов, чтобы вы знали, из какой они таблицы.
  • Никаких подзапросов для извлечения месяца из константы не требуется.
  • Вы должны указать год и месяц.

Лучший способ написать условие даты:

where d.date >= '2019-01-01' and
      d.date < '2019-01-01' + interval 1 month

Это лучше, потому что оптимизатор может использовать индекс для date, если он доступен.

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