Ruota i dati in T-SQL

Ho un gruppo di persone. Li chiamiamo A, B, C. Ho un tavolo che mostra quanto sono stati pagati ogni mese ….

PERSON|MONTH|PAID A JAN 10 A FEB 20 B JAN 10 B FEB 20 B SEP 30 C JAN 10 C JUNE 20 C JULY 30 C SEP 40 

QUESTA tabella può e va avanti per anni e anni ..

C’è un modo per ruotare questa tabella (nulla di ciò che vedo ha bisogno di essere aggregato, che di solito è fatto nei pivot) In una tabella che assomiglia al seguente?

  JAN FEB MAR APR MAY JUN JUL AGU SEP A 10 20 B 10 20 - - - - - - 30 C 10 - - - - 20 30 - 40 

Non si è imbattuto in qualcosa del genere ma supponiamo che sia un problema comune qualche idea?

Se si utilizza SQL Server 2005 (o versione successiva), ecco il codice:

 DECLARE @cols VARCHAR(1000) DECLARE @sqlquery VARCHAR(2000) SELECT @cols = STUFF(( SELECT distinct ',' + QuoteName([Month]) FROM YourTable FOR XML PATH('') ), 1, 1, '') SET @sqlquery = 'SELECT * FROM (SELECT Person, Month, Paid FROM YourTable ) base PIVOT (Sum(Paid) FOR [Person] IN (' + @cols + ')) AS finalpivot' EXECUTE ( @sqlquery ) 

Questo funzionerà indipendentemente dal numero di stati che hai. Assembla dynamicmente una query con PIVOT . L’unico modo per eseguire PIVOT con colonne dinamiche è assemblare la query in modo dinamico, operazione che può essere eseguita in SQL Server.

Altri esempi:

  • SQL Server PIVOT forse?
  • Come si crea un riepilogo collegandosi a una singola tabella con SQL Server?

Non sono sicuro del motivo per cui hai bisogno di un numero dinamico di colonne, poiché ci sono sempre 12 mesi all’anno. Anche i nomi dei tuoi mesi sembrano un po ‘incoerenti.

Set di risultati del campione:

 SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID] UNION SELECT 'A','FEB',20 UNION SELECT 'B','JAN',10 UNION SELECT 'B','FEB',20 UNION SELECT 'B','SEP',30 UNION SELECT 'C','JAN',10 UNION SELECT 'C','JUNE',20 UNION SELECT 'C','JULY',30 UNION SELECT 'C','SEP',40) AS A PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 

Contro il tuo tavolo questo diventerebbe:

 SELECT [PERSON],[MONTH],[PAID] FROM [YOURTABLE] PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 

Se aggiungi una colonna di un anno, assomiglia a questa:

 SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID], 2011 [YEAR] UNION SELECT 'A','FEB',20, 2011 UNION SELECT 'B','JAN',10, 2011 UNION SELECT 'A','FEB',20, 2010 UNION SELECT 'B','JAN',10, 2010 UNION SELECT 'B','FEB',20,2011 UNION SELECT 'B','SEP',30,2011 UNION SELECT 'C','JAN',10,2011 UNION SELECT 'C','JUNE',20,2011 UNION SELECT 'C','JULY',30,2011 UNION SELECT 'C','SEP',40,2011) AS A PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p