TSQL Challenge 16 - Solution by Mark Cowne



-- File Name: mark_cowne_tsqlchallenge_16.sql
WITH Starts(PersonID,Surname,FirstName,StartDate) AS (
 SELECT PersonID,
        Surname,
        FirstName,
        StartDate
 FROM @Membership
 UNION ALL
 SELECT a.PersonID,
        a.Surname,
        a.FirstName,
        a.EndDate+1
 FROM @Membership a
 WHERE EXISTS (SELECT * FROM @Membership b
               WHERE b.PersonID=a.PersonID
                 AND a.EndDate+1 BETWEEN b.StartDate AND COALESCE(b.EndDate,a.EndDate+1))),
                 
Ends(PersonID,EndDate) AS (
 SELECT PersonID,
        EndDate
 FROM @Membership
 UNION ALL
 SELECT a.PersonID,
        a.StartDate-1
 FROM @Membership a
 WHERE EXISTS (SELECT * FROM @Membership b
               WHERE b.PersonID=a.PersonID
                 AND a.StartDate-1 BETWEEN b.StartDate AND COALESCE(b.EndDate,a.StartDate-1)))
                 
SELECT a.PersonID,
       a.Surname,
       a.FirstName,
       STUFF((SELECT '/ ' + c.Description AS "data()"
              FROM @Membership c
              WHERE c.PersonID=a.PersonID
                AND c.StartDate<=COALESCE(MIN(b.EndDate),c.StartDate)
                AND COALESCE(c.EndDate,a.StartDate)>=a.StartDate
              ORDER BY c.StartDate
              FOR XML PATH('')
        ),1,2,'') AS Descriptions,
       a.StartDate,
       MIN(b.EndDate) AS EndDate
FROM Starts a
INNER JOIN Ends b ON b.PersonID=a.PersonID AND COALESCE(b.EndDate,'20991231')>=a.StartDate
GROUP BY a.PersonID,a.Surname,a.FirstName,a.StartDate
ORDER BY a.PersonID,a.StartDate

Did you find something incorrect/wrong with this solution? Take a few seconds to Report It.

Did you understand how this solution work? If you find it difficult to understand, you can Request an Explanation or you can Write an explanation to help others better understand this solution.