简体   繁体   English

SQL Server中的数据透视表查询

[英]Pivot table query in SQL Server

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. 我需要获取与每个不同元素的最大日期时间戳相对应的值,并使用SQL Server 2005或更高版本将行转换为列。 The column name values (ie columns A1, A2, A3 are dynamic and can change depending on data available) 列名称值(即A1,A2,A3列是动态的,可以根据可用数据进行更改)

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

You can do this using dynamic crosstab: 您可以使用动态交叉表执行此操作

SQL Fiddle SQL小提琴

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM