Как повернуть два столбца даты и заполнить пробелы несколькими перекрывающимися периодами дат
У меня есть таблица с записями об отсутствии сотрудников. Строки содержат номер сотрудника, первый и последний день отсутствия и множество других данных, таких как тип отсутствия, утвержденные и т. Д.
absencecalendarline:
EMPLOYEENUMBER | FIRSTDAYOFABSENCE | LASTDAYOFABSENCE | ABSENCETYPE | APPROVED
---------------+-------------------+------------------+-------------+----------
1 | 2013-01-01 | 2013-01-04 | VACATION | TRUE
2 | 2013-01-01 | 2013-01-02 | VACATION | TRUE
3 | 2013-02-05 | 2013-02-08 | VACATION | TRUE
2 | 2013-02-06 | 2013-02-07 | VACATION | TRUE
Я хотел бы создать представление с записями об отсутствии, перечисленными со всеми датами. Что-то вроде этого.
desired result:
EMPLOYEENUMBER | ABSENCEDATE | ABSENCETYPE | APPROVED
---------------+-------------+-------------+----------
1 | 2013-01-01 | VACATION | TRUE
1 | 2013-01-02 | VACATION | TRUE
1 | 2013-01-03 | VACATION | TRUE
1 | 2013-01-04 | VACATION | TRUE
2 | 2013-01-01 | VACATION | TRUE
2 | 2013-01-02 | VACATION | TRUE
3 | 2013-02-05 | VACATION | TRUE
.. .. .. ..
3 | 2013-02-08 | VACATION | TRUE
2 | 2013-02-06 | VACATION | TRUE
2 | 2013-02-07 | VACATION | TRUE
У меня также есть таблица дат, CALENDARDAY
загруженный со всеми датами в календаре и связанной информацией, такой как номера недель, месяцы и т. д., чтобы помочь мне с датой населения.
Моя попытка этого запроса привела к следующему коду:
SELECT unpvt.EMPLOYEENUMBER, unpvt.FIRSTORLAST, unpvt.ABSENCEDATE, unpvt.FIRSTABSENCE,
unpvt.LASTABSENCE, unpvt.ABSENCETYPE, unpvt.APPROVED, cd.THEDATE, cd.WEEKNUMBER,
(SELECT TOP 1 EMPLOYEENUMBER
FROM dbo.ABSENCECALENDARLINE asq
WHERE cd.THEDATE BETWEEN asq.FIRSTDAYOFABSENCE AND asq.LASTDAYOFABSENCE
ORDER BY cd.THEDATE DESC) EMPLOYEENUMBER
FROM
(SELECT EMPLOYEENUMBER, FIRSTDAYOFABSENCE, LASTDAYOFABSENCE, FIRSTDAYOFABSENCE AS
FIRSTABSENCE, LASTDAYOFABSENCE AS LASTABSENCE, ABSENCETYPE, APPROVED
FROM dbo.ABSENCECALENDARLINE acl) a
UNPIVOT
(ABSENCEDATE FOR FIRSTORLAST IN
(FIRSTDAYOFABSENCE, LASTDAYOFABSENCE)
) AS unpvt
RIGHT JOIN dbo.CALENDARDAY cd ON unpvt.ABSENCEDATE = cd.THEDATE
WHERE CAST(THEDATE AS datetime) BETWEEN '2013-01-01' AND '2013-12-31'
ORDER BY THEDATE
Задача, с которой я сталкиваюсь, это SELECT
подзапрос, который требует TOP 1
вызывая перекрывающиеся пропуски, можно вернуть только одного из сотрудников, отсутствовавших на определенную дату. COUNT
в этом столбце отображается количество людей, отсутствовавших в этот день.
Я думаю, что слишком сложно? Как я могу легко достичь желаемого результата? Любая помощь будет принята с благодарностью.
С наилучшими пожеланиями, Александр
1 ответ
Если я что-то упустил, я думаю, вы слишком усложняете это:
SELECT a.EMPLOYEENUMBER, b.DATE, a.ABSENCETYPE, a.APPROVED
FROM Table1 a
JOIN Calendar b
ON b.Date BETWEEN a.FIRSTDAYOFABSENCE AND a.LASTDAYOFABSENCE
Демо: SQL Fiddle