2017-01-19 4 views
0

Ich habe eine Tabelle, die wie folgt ist:Recreate Crosstab in 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 

dass ich in einer Ansicht oder eine neue Tabelle wie folgt neu erstellen möchten:

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

Wesentlichen eine Quer Registerkarte Abfrage, aber ich bin mir nicht sicher, wie dies in SSMS zu erreichen.

Irgendwelche Zeiger?

+0

Was Sie brauchen, ist 'PIVOT' – Wanderer

+0

ich, dass ein Teil herausgefunden, aber nicht herausfinden, wie es ist benutzt. – Niq6

+0

Und wie 'CODE2' für' FILE1' '12/15/2016' wird ?? – Wanderer

Antwort

0

Sie können mit einem CASE Ausdruck erreichen.

Abfrage

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]; 

Oder Sie können eine dynamische SQL-Abfrage für mehr Effizienz verwenden.

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

Das hat perfekt funktioniert. Ich war nah dran und das füllte die Lücken! – Niq6

1

Dies ist ein sehr einfaches PIVOT.

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

Returns

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

Für eine dynamische Version

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

Ich habe das ursprünglich versucht, aber es wurde nicht von FILENO gruppiert. – Niq6

+0

@ Niq6 Haben Sie zusätzliche Felder in Ihrer Tabelle? –

+0

ja. Ich vermute, das ist der Grund warum. Aber die andere Antwort funktionierte gut. Ich werde diesen Weg gehen. Danke John! – Niq6