2009-05-09 7 views
1

Je souhaite créer une requête à partir d'une seule table avec les colonnes suivantes.Comment faire pivoter des données à partir d'une table avec SQL Server 2005

SEQNO est une clé unique

Name ID Amount Date   JOBID  SEQNO 
Mark 9 200  1/2/09   1001   1 
Peter 3 300  1/2/09   1001   2 
Steve 1 200  2/2/09   1001   3 
Mark 9 200  3/2/09   1001   4 
Peter 3 300  4/2/09   1001   5 
Steve 1 200  5/2/09   1001   6 
Hally 1 200  5/2/09   1002   7 

La requête doit sortie dans ce format par SUBJOBID et une plage de dates: -

**NAME  ID  1/2  2/2  3/2  4/2  5/2  JOBID**<br> 
Mark  9  200  NULL 200  NULL NULL  1001 
Peter  3  300  NULL NULL 300  NULL  1001 
Steve  1  NULL  200  NULL NULL 200  1001 

Je vais sur les requêtes de pivot pour cela. Mais je ne semble aller nulle part. Quelqu'un pourrait-il aider?

Répondre

2

Cela peut effectivement être fait assez facilement avec une fonction PIVOT. Depuis l'autre réponse ne montre pas le code associé à la façon de l'effectuer, voici deux façons de PIVOT les données.

D'abord avec un Pivot statique. Un pivot statique est lorsque vous connaissez les données à l'avance pour les transformer en colonnes.

select * 
from 
(
    select name, id, convert(char(5), dt, 101) dt, jobid, amount 
    from test 
) x 
pivot 
(
    sum(amount) 
    for dt in ([01/02], [02/02], [03/02], [04/05], [05/05]) 
)p 
order by jobid, name 

Voir SQL Fiddle with Demo

La deuxième façon est d'utiliser un PIVOT dynamique pour identifier au moment de l'exécution des valeurs de se tourner vers des colonnes.

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(5), dt, 101)) 
        from test 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT name, id, ' + @cols + ', jobid from 
      (
       select name, id, convert(char(5), dt, 101) dt, jobid, amount 
       from test 
      ) x 
      pivot 
      (
       sum(amount) 
       for dt in (' + @cols + ') 
      ) p 
      order by jobid, name' 

execute(@query) 

Voir SQL Fiddle with Demo

deux produira les mêmes résultats. La dynamique fonctionne très bien lorsque vous ne connaissez pas les valeurs à l'avance pour convertir en colonnes.

Questions connexes