SQL Server PIVOT peut-être?

SELECT Name1, Name2, Value FROM mytable me donne l'set de résultats suivant:

 Nom1 Nom2 Valeur
 Un P1 1
 A P2 1
 Un P3 2
 B P1 3
 B P2 1
 B P4 1

Comment puis-je traduire cela pour:

        UN B
 P1 1 4
 P2 1 1
 P3 2 null
 P4 null 1

Merci,

Vous pouvez utiliser une clause PIVOT . Votre requête pourrait être quelque chose comme ceci:

 WITH Source as ( SELECT Name1, Name2, [Value] FROM mytable ) SELECT Name2, CASE WHEN A IS NOT NULL THEN A ELSE 'your ssortingng' END As A , CASE WHEN B IS NOT NULL THEN B ELSE 'your ssortingng' END As B FROM ( SELECT Name2, Name1, [Value] FROM Source ) s PIVOT ( MAX([Value]) FOR Name1 IN (A, B) -- any other Name1 would go here ) p 

en utilisant vos exemples de données ci-dessus, mes résultats ont été

 P1 1 3 P2 1 1 P3 2 your ssortingng P4 your ssortingng 1 

MODIFIER:

Puisque vous avez un nombre inconnu de colonnes, vous aurez besoin de regarder en utilisant SQL dynamic et il y a plusieurs réponses ici sur SO à ce propos avec PIVOT.

Pivot SQL Server 2005 sur un nombre inconnu de colonnes

Table pivotante et colonnes de concaténation

Puisque vous utilisez SQL Server 2005, voici le code:

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

Cela fonctionnera, peu importe le statut que vous avez. Il assemble dynamicment une requête avec PIVOT . La seule façon de faire PIVOT avec des colonnes dynamics consiste à assembler la requête dynamicment, ce qui peut être fait dans SQL Server.

D'autres exemples:

Je n'ai pas SQL Server en cours d'exécution ici au travail, donc cela ne peut pas complètement corriger syntaxiquement, mais une approche serait la tabulation croisée

 SELECT name2 , SUM(CASE WHEN name1 = 'A' THEN value END) AS A , SUM(CASE WHEN name1 = 'B' THEN value END) AS B FROM table GROUP BY name2 

Pour un nombre variable de colonnes, vous pouvez utiliser le SQL dynamic:

 DECLARE @sql varchar(max) SELECT @sql = COALESCE(@sql+',','') + 'SUM(CASE WHEN nane1 = '''+name1+''' THEN value END) AS ['+name1']' FROM table SET @sql = 'SELECT name2, '+@sql+' FROM table GROUP BY name2' EXEC(@sql)