【问题标题】:Pivot table query in SQL ServerSQL Server 中的数据透视表查询
【发布时间】:2015-12-02 05:28:48
【问题描述】:

我有如下所示的表格。我需要获取与每个不同元素的最大日期时间戳相对应的值,并使用 SQL Server 2005 或更高版本将行转换为列。列名值(即 A1、A2、A3 列是动态的,可以根据可用数据进行更改)

基表(来自结果查询)

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

期望的输出:

Id  A1  A2  A3
---------------
1   6   8   10
2   2   4   6

【问题讨论】:

  • 名称列的值数量是否有限?另外,DateTimeStamp 列的数据类型是什么?
  • 抱歉,列名也是动态的。
  • [T-SQL 动态数据透视] 的可能重复项。 (stackoverflow.com/questions/12210692/t-sql-dynamic-pivot) 请注意,您需要将数据透视结果加入到表中以获取对应于最大日期时间的值。
  • 不想使用动态查询。使用静态查询的任何可用解决方案。
  • 您有许多事先不知道的值。您希望静态查询如何工作?

标签: sql sql-server pivot


【解决方案1】:

您可以使用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

【讨论】:

  • 不使用动态查询的任何可能的解决方案。问题是我需要将结果加入另一个子查询。非常感谢您的努力。谢谢。
  • 由于Names 的数量未知,如果不使用动态 SQL,您将无法做到这一点。
  • 您可以尝试将结果插入到临时表中。
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多