ContactID Name--------------------- --------------1 John Doe2 Jane Doe
IncidentID ContactID ProgramName-------------------- ----------------- ---------------1 1 ProgramOne2 1 ProgramTwo3 2 ProgramOne
OutcomeID IncidentID Date Amount------------------ ------------------- ---------------------- ---------------1 1 1/2/2011 1002 1 1/6/2011 2003 2 2/2/2012 4554 2 2/5/2012 232 5 3 3/1/2012 151
ContactID Name IncidentID OutcomeID Date Amount OutcomeID Date Amount--------------------- -------------- -------------- ------------ -------------- ----------- --------------- -------------- -----------1 John Doe 1 1 1/2/2011 100 2 1/6/2011 2001 John Doe 2 3 2/2/2012 455 4 2/5/2012 2322 Jane Doe 2 5 3/1/2012 151 NULL NULL NULL
CREATE TABLE #Contacts (ContactID INT, Name VARCHAR(100))INSERT INTO #ContactsSELECT 1, 'John Doe' UNION ALL SELECT 2, 'Jane Doe'CREATE TABLE #Incidents (IncidentID INT, ContactID INT, ProgramName VARCHAR(100))INSERT INTO #IncidentsSELECT 1, 1, 'ProgramOne' UNION ALL SELECT 2, 1, 'ProgramTwo' UNION ALL SELECT 3, 2, 'ProgramOne'CREATE TABLE #Outcomes (OutcomeID INT, IncidentID INT, [Date] DATE, Amount INT)INSERT INTO #OutcomesSELECT 1, 1, '1/2/2011', 100UNION ALL SELECT 2, 1, '1/6/2011', 200UNION ALL SELECT 3, 2, '2/2/2012', 455UNION ALL SELECT 4, 2, '2/5/2012', 232 UNION ALL SELECT 5, 3, '3/1/2012', 151
;WITH JoinedTables AS ( SELECT a.ContactID, Name, a.IncidentID, OutcomeID, [Date], Amount ,rn=ROW_NUMBER() OVER (PARTITION BY a.IncidentID ORDER BY c.OutcomeID) FROM #Incidents a INNER JOIN #Contacts b ON a.ContactID = b.ContactID INNER JOIN #Outcomes c ON a.IncidentID = c.IncidentID )SELECT ContactID, Name, IncidentID ,OutcomeID=MAX(CASE WHEN rn=1 THEN OutcomeID END) ,[Date]=MAX(CASE WHEN rn=1 THEN [Date] END) ,Amount=MAX(CASE WHEN rn=1 THEN Amount END) ,OutcomeID=MAX(CASE WHEN rn=2 THEN OutcomeID END) ,[Date]=MAX(CASE WHEN rn=2 THEN [Date] END) ,Amount=MAX(CASE WHEN rn=2 THEN Amount END) FROM JoinedTablesGROUP BY ContactID, Name, IncidentID-- Or with Dynamic SQL if possibly more than 2 OutcomeIDsDECLARE @SQL NVARCHAR(MAX) = ';WITH JoinedTables AS ( SELECT a.ContactID, Name, a.IncidentID, OutcomeID, [Date], Amount ,rn=ROW_NUMBER() OVER (PARTITION BY a.IncidentID ORDER BY c.OutcomeID) FROM #Incidents a INNER JOIN #Contacts b ON a.ContactID = b.ContactID INNER JOIN #Outcomes c ON a.IncidentID = c.IncidentID ) SELECT ContactID, Name, IncidentID' ,@SQL1 NVARCHAR(MAX) = '';WITH JoinedTables AS ( SELECT a.ContactID, Name, a.IncidentID, OutcomeID, [Date], Amount ,rn=ROW_NUMBER() OVER (PARTITION BY a.IncidentID ORDER BY c.OutcomeID) FROM #Incidents a INNER JOIN #Contacts b ON a.ContactID = b.ContactID INNER JOIN #Outcomes c ON a.IncidentID = c.IncidentID ), MaxOutcomes AS ( SELECT m=MAX(Outcomes) FROM ( SELECT Outcomes=COUNT(*) FROM JoinedTables GROUP BY ContactID, Name, IncidentID) a), Tally (n) AS ( SELECT TOP (SELECT m FROM MaxOutcomes) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.all_columns)SELECT @SQL1 = @SQL1 + ',OutcomeID=MAX(CASE WHEN rn=' + CAST(n AS VARCHAR) + ' THEN OutcomeID END) ' + ',[Date]=MAX(CASE WHEN rn=' + CAST(n AS VARCHAR) + ' THEN [Date] END) ' + ',Amount=MAX(CASE WHEN rn=' + CAST(n AS VARCHAR) + ' THEN Amount END) ' FROM TallySELECT @SQL = @SQL + @SQL1 + ' FROM JoinedTables GROUP BY ContactID, Name, IncidentID'EXEC (@SQL)DROP TABLE #OutcomesDROP TABLE #IncidentsDROP TABLE #Contacts