2012-11-06 11 views
7

Sono sicuro che questa sia una tecnica semplice anche se non riesco a trovare una risposta finora!Tabella pivot di MS SQL Server con sottoquery nella clausola di colonna

ho

TIMESTAMP   | POINTNAME | VALUE 
2012-10-10 16:00:00 AHU01  20 
2012-10-10 16:00:00 AHU02  25 
2012-10-10 16:00:15 AHU01  26 
2012-10-10 16:00:15 AHU02  35 

ecc ... (per circa 800 POINTNAMES)

con molti pointnames Non voglio elencare ciascuno nella clausola 'IN' del perno 'FOR' (come sintassi data sotto) definizione ma vorrebbe usare forse una subquery.

Quindi quello che vorrei sono tutti i valori POINTNAME come colonne con una colonna TIMESTAMP E VALUE, quindi otterrò un valore TIMESTAMP e molte colonne con ogni POINTNAME, c'è solo un valore per POINTNAME PER TIMESTAMP quindi non t necessario aggregare qualsiasi cosa, quindi scegli solo max comunque?

Qualcosa di simile:

SELECT [TIMESTAMP] FROM (SELECT * FROM POINT_TABLE) 
PIVOT(Max[Value] FOR [POINTNAME] IN (SELECT DISTINCT [POINTNAME] FROM POINT_TABLE) 

sarebbe produce-

TIMESTAMP    AHU01   AHU02 
2012-10-10 16:00:00  20    25 
2012-10-10 16:15:00  26    35 

mi rendo conto che probabilmente non è questo semplice ma spero che si ottiene quello che sto cercando di realizzare?

PIVOT sintassi:

SELECT <non-pivoted column>, 
    [first pivoted column] AS <column name>, 
    [second pivoted column] AS <column name>, 
    ... 
    [last pivoted column] AS <column name> 
FROM 
    (<SELECT query that produces the data>) 
    AS <alias for the source query> 
PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], 
    ... [last pivoted column]) 
) AS <alias for the pivot table> 
<optional ORDER BY clause>; 
+1

Si sposta chiave sembrano essere rotto. Le parole casuali sono in maiuscolo per qualche motivo. –

risposta

11

per il numero di colonne dinamica è necessario utilizzare SQL dinamico

declare 
    @cols nvarchar(max), 
    @stmt nvarchar(max) 

select @cols = isnull(@cols + ', ', '') + '[' + T.POINTNAME + ']' from (select distinct POINTNAME from TABLE1) as T 

select @stmt = ' 
    select * 
    from TABLE1 as T 
     pivot 
     (
      max(T.VALUE) 
      for T.POINTNAME in (' + @cols + ') 
     ) as P' 

exec sp_executesql @stmt = @stmt 

SQL FIDDLE EXAMPLE

+0

Compagno fantastico grazie mille! ;-) – user1801843

+0

E poi creare una nuova tabella in base al risultato? Scusa ancora un novellino! – user1801843

+0

Vuoi creare una tabella temporanea in base al risultato? O vuoi creare un vero tavolo? –

Problemi correlati