如何在 T-SQL 中为 SQL 服务器转换数据

How to pivot data in T-SQL for SQL Server

我有一个具有以下结构的 table,其中 "SymbolQuoteID" 有不同类型的结果。

AnalysisResultID    SymbolQuoteID   ResultTypeID    Result            Updated
11                  368             1               48.6750775191538  2015-10-08 22:09:15.680
12                  368             2               47.7401046493826  2015-10-08 22:09:15.680
13                  368             3               47.3978529584944  2015-10-08 22:09:15.680
14                  368             4               43.4227483517635  2015-10-08 22:09:15.680
15                  369             1               44.9316592945153  2015-10-08 22:09:15.680
16                  369             2               48.8348167760945  2015-10-08 22:09:15.680
17                  369             3               51.6463393199821  2015-10-08 22:09:15.680
18                  369             4               51.7885923247485  2015-10-08 22:09:15.680

我需要 SELECT 数据,因此它的格式如下,其中 ResultTypeID 是列 header,相应的结果列值是列数据。没有聚合,只有结果值。此外,ResultTypeID 的值数量将与单个查询一致 w/in,但可能因查询而异。例如,一次可能是 1 到 4,另一次是 1 到 7,等等。因此,旋转 table 中的列数将根据数据而变化。

SymbolQuoteID                1                 2                 3                 4                 
368           48.6750775191538  47.7401046493826  47.3978529584944  43.4227483517635
369           44.9316592945153  48.8348167760945  51.6463393199821  51.7885923247485

PIVOT 似乎可以工作,但我以前没有使用过它。任何帮助表示赞赏。

SELECT * FROM 
(
SELECT SymbolQuoteID   
      ,ResultTypeID    
      ,Result
FROM TableName ) t
 PIVOT (SUM(Result)
        FOR ResultTypeID
        IN ([1],[2],[3],[4])
       )p

你可以使用动态 PIVOT:

SQL Fiddle

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

SET @cols = 
    STUFF((
        SELECT DISTINCT ',' + QUOTENAME(ResultTypeID) 
        FROM tbl 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
    , 1, 1, '')

SET @query = 
    'SELECT SymbolQuoteID, ' + @cols + '
    FROM (
        SELECT
            SymbolQuoteID, ResultTypeID, Result
        FROM tbl
    )t
    PIVOT 
    (
        MAX(Result)
        FOR ResultTypeID IN (' + @cols + ')
    ) p '

PRINT (@query)
EXEC (@query)

您也可以使用 dynamic crosstab:

SQL Fiddle

DECLARE @maxResultTypeId INT
SELECT TOP 1 @maxResultTypeId = ResultTypeId FROM tbl ORDER BY ResultTypeID DESC

DECLARE @sql NVARCHAR(MAX) = ''

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

SELECT @sql = @sql +
'   , MAX(CASE WHEN ResultTypeId = ' + CONVERT(VARCHAR(3), rn) + ' THEN Result  END) AS ' + QUOTENAME(rn) + CHAR(10)
FROM(
    SELECT TOP(@maxResultTypeId)
        ROW_NUMBER() OVER(ORDER BY (SELECT NULL))  AS rn
    FROM sys.columns
)t

SELECT @sql = @sql +
'FROM tbl
GROUP BY SymbolQuoteID'

PRINT (@sql)
EXEC (@sql)