Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server :traspone le righe in colonne

Un modo per farlo se tagID i valori sono noti in anticipo consiste nell'utilizzare l'aggregazione condizionale

SELECT TimeSeconds,
       COALESCE(MAX(CASE WHEN TagID = 'A1' THEN Value END), 'n/a') A1,
       COALESCE(MAX(CASE WHEN TagID = 'A2' THEN Value END), 'n/a') A2,
       COALESCE(MAX(CASE WHEN TagID = 'A3' THEN Value END), 'n/a') A3,
       COALESCE(MAX(CASE WHEN TagID = 'A4' THEN Value END), 'n/a') A4
  FROM table1
 GROUP BY TimeSeconds
 

o se sei d'accordo con NULL valori invece di 'n/a'

SELECT TimeSeconds,
       MAX(CASE WHEN TagID = 'A1' THEN Value END) A1,
       MAX(CASE WHEN TagID = 'A2' THEN Value END) A2,
       MAX(CASE WHEN TagID = 'A3' THEN Value END) A3,
       MAX(CASE WHEN TagID = 'A4' THEN Value END) A4
  FROM table1
 GROUP BY TimeSeconds
 

o con PIVOT

SELECT TimeSeconds, A1, A2, A3, A4
  FROM
(
  SELECT TimeSeconds, TagID, Value
    FROM table1
) s
PIVOT
(
  MAX(Value) FOR TagID IN (A1, A2, A3, A4)
) p
 

Output (con NULL s):

TimeSeconds A1 A2 A3 A4----------- ------- ------ ----- -----1378700244 3.75 NULL NULL NULL1378700245 30.00 NULL NULL Null1378700304 1.20 null null null1378700305 null 56.00 null null1378700344 null 11.00 null null1378700345 null null 0.53 null1378700364 4.00 null Null1378700365 14.50 null13870038700387003 NULL NULL1387003 NULL NULL138700387003 

Se devi calcolare TagID valori in modo dinamico, quindi utilizzare SQL dinamico

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID)
            FROM Table1
            ORDER BY 1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @sql = 'SELECT TimeSeconds, ' + @cols + '
              FROM
            (
              SELECT TimeSeconds, TagID, Value
                FROM table1
            ) s
            PIVOT
            (
              MAX(Value) FOR TagID IN (' + @cols + ')
            ) p'

EXECUTE(@sql)