У меня есть ссылка на данные сотрудника ниже
Это один из примеров в файле, состоящем из нескольких строк. Первоначальный ввод может содержать более двух строк для каждого сотрудника, но логика преобразования будет такой же.
Спасибо за помощь!
После настройки некоторых тестовых данных:
DECLARE @EmployeeUtil TABLE (
Employee_ID INT,
[Date] DATE,
Previous_FTE DECIMAL(3,2),
FTE DECIMAL(3,2)
)
INSERT INTO @EmployeeUtil
SELECT 1, '2016-03-24', 1, 0.67
UNION
SELECT 1, '2016-04-24', 0.67, 0.8
UNION
SELECT 1, '2016-06-01', 0.8, 1
UNION
SELECT 2, '2016-01-01', 1, 0.5
UNION
SELECT 2, '2016-02-03', 0.5, 0.6
UNION
SELECT 2, '2016-03-25', 0.6, 0.8
UNION
SELECT 2, '2016-04-20', 0.8, 0.25
UNION
SELECT 2, '2016-05-01', 0.25, 0.4
UNION
SELECT 2, '2016-06-01', 0.4, 0.8
UNION
SELECT 2, '2016-07-01', 0.8, 1
Я бы использовал оконные функции для достижения желаемого результата:
SELECT Employee_ID,
[Date] AS [Start_date],
LEAD([Date]) OVER (PARTITION BY Employee_ID ORDER BY [DATE]) AS [End Date],
FTE
FROM @EmployeeUtil
UNION
SELECT e1.Employee_ID,
NULL AS [Start_date],
FIRST_VALUE(e1.[Date]) OVER (PARTITION BY e1.Employee_ID ORDER BY e1.[DATE]) AS [End Date],
FIRST_VALUE(e1.Previous_FTE) OVER (PARTITION BY e1.Employee_ID ORDER BY e1.[DATE]) AS FTE
FROM @EmployeeUtil e1
ORDER BY 1, 2, 3
В SELECT
в первой части UNION
выбирает все диапазоны дат с соответствующими датами начала и окончания и значениями FTE для этого диапазона дат, за исключением неограниченного периода до самой ранней даты, зарегистрированной для каждого сотрудника.
В SELECT
во второй части UNION
решает эту проблему, создавая дополнительную строку в результатах для каждого сотрудника, чтобы показать его значение FTE до самой ранней даты.