Как выбрать календарь на полный месяц с условием посещаемости в MySQL?

#mysql

#mysql

Вопрос:

Добрый день! Я пытался найти эту проблему по всему переполнению стека, но не могу найти нужное ключевое слово для поиска, думаю, лучше обратиться к вам, ребята, за помощью.

Я пытаюсь создать историю посещаемости, основанную на двух таблицах:

  1. таблица посещаемости
  2. таблица размеров календаря

в таблице посещаемости приведены данные, как показано ниже

 | idnumber | punchin | punhout | date_created |  ------------- ------------- ------------- ----------------  | 0002 | 7:30:00 | 16:00:00 | 2021-11-27 | | 0003 | 7:30:00 | 16:00:00 | 2021-11-27 | | 0004 | 7:30:00 | 16:00:00 | 2021-11-27 |   | 0002 | 7:30:00 | 16:00:00 | 2021-11-28 | | 0003 | 7:30:00 | 16:00:00 | 2021-11-28 | | 0004 | 7:30:00 | 16:00:00 | 2021-11-28 |  | 0001 | 7:30:00 | 16:00:00 | 2021-11-29 | | 0002 | 7:30:00 | 16:00:00 | 2021-11-29 | | 0003 | 7:30:00 | 16:00:00 | 2021-11-29 | | 0004 | 7:30:00 | 16:00:00 | 2021-11-29 |  

а calendar_dimension-это просто базовая таблица с датами, вот так:

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

 | date | datestatus |  ------------- ---------------  | 2021-11- 1 to 2021-11-25 | | 2021-11-26 | Holiday | | 2021-11-27 | | | 2021-11-28 | | | 2021-11-29 | | | 2021-11-30 | |  

То, что я сделал до сих пор, — это объединил calendar_dimension и таблицу посещаемости.

Теперь у меня есть что-то вроде этого: например, для 00001, который работает с моей стороны:

 | idnumber | punchin | punhout | date_created |  ------------- ------------- ------------- ----------------  | 0001 | 7:30:00 | 16:00:00 | 2021-11-29 |  

И за 0002:

 | idnumber | punchin | punhout | date_created | Status |  ------------- ------------- ------------- ---------------- ------------  | 0001 | 7:30:00 | 16:00:00 | 2021-11-27 | Present | | 0001 | 7:30:00 | 16:00:00 | 2021-11-28 | Present | | 0001 | 7:30:00 | 16:00:00 | 2021-11-29 | Present |  

Я хочу, чтобы моя таблица истории выглядела так по сотрудникам:

 | idnumber | punchin | punhout | date_created | Status |  ------------- ------------- ------------- ---------------- ------------  | 2021-11-1 to 2021-11-25 | | 0001 | 7:30:00 | 16:00:00 | 2021-11-26 | Holiday | | 0001 | 7:30:00 | 16:00:00 | 2021-11-27 | Absent | | 0001 | 7:30:00 | 16:00:00 | 2021-11-28 | Absent | | 0001 | 7:30:00 | 16:00:00 | 2021-11-29 | Present |  

30 ноября будет показано завтра.

есть ли другой способ сделать это возможным? Спасибо

Ответ №1:

Я предполагаю, что вы пытаетесь вычислить status столбец, верно?

Что-то вроде IF(datestatus = 'Holiday', 'Holiday', IFNULL(punchin, 'Absent', 'Present')) AS status «должно сработать», хотя и немного неэлегантно.

Вам нужно будет убедиться, что вы не выполняете внутреннее объединение, чтобы получить строку, в которой нет посещаемости для этого идентификатора, т. Е., calendar_dimension c LEFT JOIN attendance a ON ...

Комментарии:

1. Я попытался присоединиться слева с помощью c.date = a.date_created, но все равно получил тот же результат.

2. Примерьте c.дата = a.дата создания И.idnumber = ‘0001’

3. вау, это работает, спасибо

4. Рад, что это помогло!