2013-10-25 17 views
30

Ich habe die folgende Tabelle, aber nicht sicher, ob es möglich ist, dies zu schwenken und alle Etiketten zu behalten.TSQL PIVOT MULTIPLE COLUMNS

RATIO    RESULT SCORE GRADE 
Current Ratio  1.294 60  Good 
Gearing Ratio  0.3384 70  Good 
Performance Ratio 0.0427 50  Satisfactory 
TOTAL    NULL 180  Good 

ich nicht sehr gut zu sein bei der Verwendung von schwenkt zugeben wird, so dass nach mehreren Versuchen in dieser Ausgabe führt:

I
Ratio Current Ratio Gearing Ratio Performance Ratio 
Result 1.294  0.3384  0.0427 

:

SELECT 'RESULT' AS 'Ratio' 
    ,[Current Ratio] AS 'Current Ratio' 
    ,[Gearing Ratio] AS 'Gearing Ratio' 
    ,[Performance Ratio] AS 'Performance Ratio' 
    ,[TOTAL] AS 'TOTAL' 
FROM 
(
    SELECT RATIO, RESULT 
    FROM GRAND_TOTALS 
) AS SREC 
PIVOT 
(
    MAX(RESULT) 
    FOR RATIO IN ([Current Ratio],[Gearing Ratio], [Performance Ratio], [TOTAL]) 
) AS PVT 

Dies ist das Ergebnis gibt Ich gebe zu, dass ich sehr verwirrt darüber bin, was ich als Nächstes tun muss, um das Ergebnis zu erzeugen, das ich brauche:

Ratio Current Ratio Gearing Ratio Performance Ratio TOTAL 
Result  1.294  0.3384    0.0427   NULL 
Score  60    70    50    180 
Grade  Good   Good   Satisfactory   Good 
+0

Welche Version von SQL Server verwenden Sie? – Taryn

+0

mögliche Duplikate von [Mehrere Spalten Pivot in T-SQL] (http://stackoverflow.com/questions/947281/multiple-column-pivot-in-t-sql) –

Antwort

39

Da Sie mehrere Datenspalten drehen möchten, würde ich zuerst vorschlagen, die result, score und grade Spalten zu deaktivieren, so dass Sie nicht mehrere Spalten haben, aber Sie mehrere Zeilen haben.

Abhängig von Ihrer Version von SQL Server können Sie die UNPIVOT-Funktion oder CROSS APPLY verwenden. Die Syntax, die Daten UNPIVOT wird ähnlich sein:

select ratio, col, value 
from GRAND_TOTALS 
cross apply 
(
    select 'result', cast(result as varchar(10)) union all 
    select 'score', cast(score as varchar(10)) union all 
    select 'grade', grade 
) c(col, value) 

SQL Fiddle with Demo See. Sobald die Daten nicht verschwenkten wurde, dann können Sie die Pivot-Funktion anwenden:

select ratio = col, 
    [current ratio], [gearing ratio], [performance ratio], total 
from 
(
    select ratio, col, value 
    from GRAND_TOTALS 
    cross apply 
    (
    select 'result', cast(result as varchar(10)) union all 
    select 'score', cast(score as varchar(10)) union all 
    select 'grade', grade 
) c(col, value) 
) d 
pivot 
(
    max(value) 
    for ratio in ([current ratio], [gearing ratio], [performance ratio], total) 
) piv; 

SQL Fiddle with Demo See. Dies gibt Ihnen das Ergebnis:

| RATIO | CURRENT RATIO | GEARING RATIO | PERFORMANCE RATIO |  TOTAL | 
|--------|---------------|---------------|-------------------|-----------| 
| grade |   Good |   Good |  Satisfactory |  Good | 
| result |  1.29400 |  0.33840 |   0.04270 | (null) | 
| score |  60.00000 |  70.00000 |   50.00000 | 180.00000 | 
+1

Ich werde immer von PIVOT Lösungen von wahren beeindruckt sein Experten! Ich habe das hier gefunden: http://pratchev.blogspot.de/2009/01/pivoting-on-multiple-columns.html. Im zweiten Abschnitt schlägt der Autor zwei PIVOT-Klauseln in einer Aussage vor. Gibt es da einen Nachteil? –

+0

@DerU Es hängt wirklich davon ab, ich persönlich lieber zu entpivotieren, so dass die Daten in einem einfacheren Format dann zwei Drehpunkte anwenden. – Taryn