2010-07-29 3 views
3

S'il vous plaît laissez-moi savoir, Comment convertir les données suivantes,SQl Server 2005: Rows to columns - comment relever ce défi?

[id] cost1 cost2 year 
    1  5  10 2010 
    1  4  15 2011 
    2  10  10 2010 

dans ce format [lignes de 'année' à colonnes rubrique]

id [cost1-2010] [cost2-2010] [cost1-2011] [cost2-2011] 
1   5   10   4   15 
2   10   10   0   0 

Répondre

1

essayer quelque chose comme ceci:

DECLARE @YourTable table (id int, cost1 int, cost2 int, year int) 
INSERT @YourTable VALUES (1,5,10,2010) 
INSERT @YourTable VALUES (1,4,15,2011) 
INSERT @YourTable VALUES (2,10,10,2010) 

SELECT 
    id 
     ,SUM(CASE WHEN year=2010 THEN cost1 else 0 END) AS "Cost1-2010" 
     ,SUM(CASE WHEN year=2010 THEN cost2 else 0 END) AS "Cost2-2010" 
     ,SUM(CASE WHEN year=2011 THEN cost1 else 0 END) AS "Cost1-2011" 
     ,SUM(CASE WHEN year=2011 THEN cost2 else 0 END) AS "Cost2-2010" 
    FROM @YourTable 
    GROUP BY id 

SORTIE

id   Cost1-2010 Cost2-2010 Cost1-2011 Cost2-2010 
----------- ----------- ----------- ----------- ----------- 
1   5   10   4   15 
2   10   10   0   0 

(2 row(s) affected) 
0

Si vous voulez faire cela dynamiquement en fonction des données, cela va être plus difficile que de simplement utiliser PIVOT. Pour PIVOT ou la technique de la somme conditionnelle

[2010Values] = (SUM(Case when year = 2010 then FieldValue Else 0 End) 

vous devez connaître le nom de la colonne à l'avance.

Si vous souhaitez définir les noms de colonne de manière dynamique en fonction des données reçues, vous devrez utiliser la route SQL dynamique qui peut être laide.

+0

comment faire dans SQL dynamique ......? un peu plus d'infos ?? – Dhana

+0

http://www.sommarskog.se/dynamic_sql.html#Crosstab – Jeremy