2017-01-19 2 views
0

J'ai une table qui est comme ça:Recréer Crosstab dans SQL Server

FILENO CODE FIELD 
FILE1 *CODE1 SOK 
FILE1 *CODE2 AUTO 
FILE1 *CODE3 CTY 
FILE2 *CODE1 SOK 
FILE2 *CODE2 AR 
FILE2 *CODE3 CTN 
FILE3 *CODE1 SOKN 
FILE3 *CODE2 AUTO 
FILE3 *CODE3 CTN 

que je voudrais recréer dans une vue ou une nouvelle table comme ceci:

FILENO *CODE1 *CODE2 *CODE3 
FILE1 SOK  AUTO CTY 
FILE2 SOK  AR  CTN  
FILE3 SOKN AUTO CTN 

Essentiellement une croisée requête d'onglet, mais je ne suis pas sûr de savoir comment accomplir cela dans SSMS.

Des pointeurs?

+0

Qu'est-ce que vous avez besoin est 'PIVOT' – Wanderer

+0

Je me suis partie à mais ne peut pas comprendre comment il est utilisé. – Niq6

+0

Et comment 'CODE2' pour' FILE1' devient '12/15/2016' ?? – Wanderer

Répondre

0

Vous pouvez obtenir avec une expression CASE.

Recherche

SELECT [FILENO], 
MAX(CASE CODE WHEN '*CODE1' THEN FIELD END) AS [*CODE1], 
MAX(CASE CODE WHEN '*CODE2' THEN FIELD END) AS [*CODE2], 
MAX(CASE CODE WHEN '*CODE3' THEN FIELD END) AS [*CODE3] 
FROM [your_table_name] 
GROUP BY [FILENO]; 

Ou vous pouvez utiliser une requête SQL dynamique pour une plus grande efficacité.

DECLARE @sql AS VARCHAR(MAX); 
SELECT @sql = 'SELECT [FILENO], ' 
       + STUFF((SELECT DISTINCT ', MAX(CASE [CODE] 
       WHEN ''' + [CODE] + ''' 
       THEN [FIELD] END) AS [' + [CODE] + ']' 
       FROM [your_table_name] 
       FOR XML PATH('') 
       ), 1, 2, '') 
       +' FROM [your_table_name] GROUP BY [FIELDNO]'; 

EXEC(@sql); 
+0

Cela a fonctionné parfaitement. J'étais proche et cela a comblé les lacunes! – Niq6

1

Ceci est très basique PIVOT.

Select [FILENO],[*CODE1],[*CODE2],[*CODE3] 
From (Select FileNo,Code,Field from YourTable) A 
Pivot (max(FIELD) For CODE in ([*CODE1],[*CODE2],[*CODE3])) p 

Retours

FILENO *CODE1 *CODE2 *CODE3 
FILE1 SOK  AUTO CTY 
FILE2 SOK  AR  CTN 
FILE3 SOKN AUTO CTN 

Pour une version dynamique

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([Code]) From YourTable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [FILENO],' + @SQL + ' 
From (Select FileNo,Code,Field from YourTable) A 
Pivot (max(FIELD) For [CODE] in (' + @SQL + ')) p' 
Exec(@SQL); 
+0

Je l'ai d'abord essayé mais il ne l'a pas groupé par FILENO. – Niq6

+0

@ Niq6 avez-vous des champs supplémentaires dans votre tableau? –

+0

oui. Je suppose que c'est la raison pour laquelle. Mais l'autre réponse a bien fonctionné. Je vais suivre cette route. merci John! – Niq6