1

I have table as shown below. I need to get the values corresponding to maximum date timestamp for each distinct element and convert the rows to columns using SQL Server 2005 or higher. The column name values (i.e. columns A1, A2, A3 are dynamic and can change depending on data available)

Base table (from a resulting query)

Id  Name    Value   DateTimeStamp
--------------------------------------
1   A1  5   Nov 14 2011 03:12:12:947PM
1   A1  6   Nov 15 2011 03:12:12:947PM
1   A2  7   Nov 14 2011 03:12:12:947PM
1   A2  8   Nov 15 2011 03:12:12:947PM
1   A3  9   Nov 14 2011 03:12:12:947PM
2   A3  10  Nov 15 2011 03:12:12:947PM
2   A1  1   Nov 14 2011 03:12:12:947PM
2   A1  2   Nov 15 2011 03:12:12:947PM
2   A2  3   Nov 14 2011 03:12:12:947PM
2   A2  4   Nov 15 2011 03:12:12:947PM
2   A3  5   Nov 14 2011 03:12:12:947PM
2   A3  6   Nov 15 2011 03:12:12:947PM

Desired output:

Id  A1  A2  A3
---------------
1   6   8   10
2   2   4   6
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
TrustyCoder
  • 4,749
  • 10
  • 66
  • 119

1 Answers1

0

You can do this using dynamic crosstab:

SQL Fiddle

DECLARE @sql NVARCHAR(MAX) = ''

SELECT @sql =
'SELECT
    Id' + CHAR(10)

SELECT @sql = @sql +
    ', MAX(CASE WHEN Name = ''' + Name +  ''' THEN Value END) AS ' + QUOTENAME(Name) + CHAR(10)
FROM (SELECT DISTINCT Name FROM tbl) t
ORDER BY Name

SELECT @sql = @sql +
'FROM (
    SELECT *,
        RN = ROW_NUMBER() OVER(PARTITION BY Id, Name ORDER BY DateTimeStamp DESC)
    FROM tbl
) t
WHERE Rn = 1
GROUP BY Id
ORDER BY Id'

EXEC sp_executesql @sql
Felix Pamittan
  • 31,544
  • 7
  • 41
  • 67