This should do the trick. Hope it helps
DECLARE @Table2 TABLE (RowID INT IDENTITY(1, 1),
panelistId INT ,
#ofExposures VARCHAR(MAX),
Exposure_DTTMVARCHAR(MAX))
DECLARE @Table TABLE (ID INT ,
DTTM VARCHAR(30)) INSERT INTO @Table (ID,
DTTM) VALUES ('337322', '7/27/2014 19:39'), ('337322', '7/27/2014 19:29'), ('317420', '7/27/2014 10:22'), ('317420', '7/27/2014 10:22'), ('317420', '7/27/2014 9:27'), ('336333', '7/27/2014 5:41'), ('336333', '7/27/2014 3:26'), ('336333', '7/27/2014 3:26'), ('336333', '7/27/2014 1:25'); WITH cte_StageOne
AS (
SELECT ROW_NUMBER() OVER(PARTITION BY id ORDER BY CAST(t.DTTM AS DATETIME) ) AS OrderID, *
FROM @Table AS t
)
INSERT INTO @Table2
SELECT MAX(ID) AS panelistId,
MAX(OrderID) AS #ofExposures,
STUFF((
SELECT ' | ' + cso.DTTM
FROM cte_StageOne AS cso
WHERE ocso.ID = cso.ID
FOR XML PATH('')
), 1, 3, '') AS #Exposure
FROM cte_StageOne AS ocso
GROUP BY ID
--SELECT * FROM @Table2
DECLARE @MaxDTTM INT DECLARE @StartLoop INT DECLARE @EndLoop INT DECLARE @ColumnList VARCHAR(MAX)
SELECT @MaxDTTM = MAX(#ofExposures),
@EndLoop = MAX(RowID),
@StartLoop = MIN(RowID) FROM @Table2
SET @ColumnList = 'panelistId|#ofExposures|Exposure_DTTM1'
WHILE @StartLoop <= @EndLoop
BEGIN
SET @ColumnList = @ColumnList + '|Exposure_DTTM' + CAST(@StartLoop + 1 AS VARCHAR(3))
SET @StartLoop = @StartLoop + 1
END SET @ColumnList = @ColumnList
SET @StartLoop = 1
WHILE @StartLoop <= @EndLoop
BEGIN
DECLARE @in_panelistId VARCHAR(10)
DECLARE @in_ofExposures VARCHAR(10)
DECLARE @in_Exposure_DTTM VARCHAR(MAX)
SELECT @in_panelistId = panelistId,
@in_ofExposures = #ofExposures,
@in_Exposure_DTTM = Exposure_DTTM
FROM @Table2
WHERE RowID = @StartLoop
SET @ColumnList = @ColumnList + CHAR(13) + CHAR(10) + @in_panelistId + '|' + @in_ofExposures + '|' + @in_Exposure_DTTM + REPLICATE('|', @MaxDTTM - @in_ofExposures)
--PRINT REPLICATE('|',@MaxDTTM - @in_ofExposures)
SET @StartLoop = @StartLoop + 1
END PRINT @ColumnList
{ }) on the editor toolbar to nicely format and syntax highlight it!count(*) group by panelistIdand thenpivot