2009-04-24 7 views
1

Quelltabelle:SQL Server PIVOT Hilfe

Create Table ExamAnswers 
{ 
    StudentID varchar(12), 
    QuestionID int, 
    Answer char(1) 
} 

und dies wird für etwa 500 Studenten mit

Bob 1 a 
Bob 2 c 
... 
Bob 100 b 
Chris 1 c 
Chris 2 d 
... 
Chris 100 null 

usw., gefüllt werden.

Chris hat die Prüfung nicht abgeschlossen, aber die 100. Frage wird als Null gespeichert, so dass garantiert ist, dass jeder Schüler genau 100 Zeilen hat, aber die tatsächliche Antwort ist Null oder Zeichen.

Wenn es einen Unterschied macht, Antworten auf {a, b, c, d, e, f}

Dieses Setup funktioniert gut für die tatsächliche Prüfung Anwendung und Kennzeichnung es trivial ist.

Jetzt habe ich eine Meldepflicht, dass für Prüfzwecke, ich brauche eine Tabelle zu erzeugen, die wie folgt aussieht:

ID 1 2 ... 100 
Bob a c ... b 
Chris c d ....null 

Also habe ich einen halben Tag verbrachte über die Pivot-Funktion zu lesen, und ich gerade don versteh es nicht.

Das muss die undurchdringlichste Dokumentation sein, die ich je gelesen habe.

Für eine Sache, erfordert es und Aggregat Funktion - Was zum Teufel soll ich hier aggregieren?

Ich denke, dies ist nur über die einfachste Verwendung der PIVOT-Funktion, die es könnte, und ich kann nirgendwo ein anständiges Beispiel finden. HILFE!

Antwort

1

OK löste es. MAX oder MIN funktionieren in einem Char-Feld. So :

Create Table ExamAnswers 
{ 
    StudentID varchar(12), 
    QuestionID int, 
    Answer char(1) 
} 

Wie erstellt ursprünglich

Und dann

SELECT StudentID, [1] as Q1, [2] as Q2, [3] as Q3, [4] as Q4, [5] as Q5 
FROM 
(
SELECT StudentID, QuestionID, Answer 
FROM dbo.ExamAnswers 
) AS piv 
PIVOT 
(
MAX(Answer) 
FOR QuestionID IN ([1], [2], [3], [4], [5]) 
) AS chld 

Die Verwirrung liegt in der Auswahl eines Aggregats, wo es keinen logischen Grund, etwas zu aggregieren ist. Ich sollte erwähnen, dass StudentID und QuestionID einen zusammengesetzten Schlüssel bilden, daher gibt es nur einen möglichen Antwortwert für ein bestimmtes SID- und QID-Paar.

3

Blick auf diesen Artikel: Using PIVOT and UNPIVOT

Zitat:

The following is annotated syntax for PIVOT. 

SELECT <non-pivoted column> , 

    [first pivoted column] AS <column name> , 

    [second pivoted column] AS <column name> , 

    ... 

    [last pivoted column] AS <column name> 

FROM 

    (<SELECT query that produces the data>) 

    AS <alias for the source query> 

PIVOT 

( 

    <aggregation function>(<column being aggregated>) 

FOR 

[<column that contains the values that will become column headers>] 

    IN ([first pivoted column] , [second pivoted column] , 

    ... [last pivoted column]) 

) AS <alias for the pivot table> 

<optional ORDER BY clause> 

Wie man dort sehen kann, muss Aggregationsfunktion sein (Spalte zusammengefasst werden). Also Antwort Spalte in Ihrer Tabelle muss Integer (dezimal, etc.), nicht char (1) sein.

EDIT: MIN() und MAX() arbeiten für char Datentyp().

Ihre Tabelle kann so aussehen:

Create Table ExamAnswers 
(
    StudentID varchar(12) NOT NULL, 
    QuestionID int NOT NULL, 
    Answer int 
) 

Und SELECT-Anweisung mit PIVOT, dass das Ergebnis werden Sie brauchen geben:

SELECT StudentID, [1] as Q1, [2] as Q2, [3] as Q3, [4] as Q4, [5] as Q5 
FROM 
(
SELECT StudentID, QuestionID, Answer 
FROM dbo.ExamAnswers 
) AS piv 
PIVOT 
(
AVG(Answer) 
FOR QuestionID IN ([1], [2], [3], [4], [5]) 
) AS chld 
+0

Antwort ist ein Brief. Es ist kein Int. Ich kann keinen Brief schreiben. Ich kann nicht eins, ich will kein COUNT. Wenn der Buchstabe "a" ist, würde ich gerne "a" sehen. Warum ist das so schwierig? –

+0

Pivot-Klausel benötigt Aggregatfunktion, aber Aggregatfunktionen (aber COUNT(), die Sie nicht benötigen) funktionieren nur für numerische Datentypen. –

+0

Ok, du hast mich in die richtige Richtung gelenkt. Die Lösung ist, in diesem Fall MAX oder MIN zu verwenden. –