-- Prepare sample data
DECLARE @Sample TABLE
(
[Role] INT NOT NULL,
[From] DATE NOT NULL,
[To] DATE NULL
);
INSERT @Sample
(
[Role],
[From],
[To]
)
VALUES (1, '20120101', '20120808'),
(2, '20120202', '20120505'),
(3, '20120606', NULL);
-- Solution by SwePeso
;WITH cteSource(theDate)
AS (
SELECT u.theDate
FROM @Sample AS s
UNPIVOT (
theDate
FOR theColumn IN (s.[From], s.[To])
) AS u
)
SELECT STUFF(w.Data, 1, 2, '') AS Roles,
s.theDate AS [From],
f.theDate AS [To]
FROM cteSource AS s
OUTER APPLY (
SELECT TOP(1) x.theDate
FROM cteSource AS x
WHERE x.theDate > s.theDate
ORDER BY x.theDate
) AS f(theDate)
OUTER APPLY (
SELECT DISTINCT ', ' + CAST(q.[Role] AS VARCHAR(12))
FROM @Sample AS q
WHERE s.theDate >= q.[From]
AND (s.theDate < q.[To] OR q.[To] IS NULL)
ORDER BY ', ' + CAST(q.[Role] AS VARCHAR(12))
FOR XML PATH('')
) AS w(Data)
ORDER BY s.theDate;
N 56°04'39.26"
E 12°55'05.63"