2009-04-24 18 views
1

ソーステーブル:SQL ServerのPIVOTヘルプ

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

と、これは、約500の学生のために、

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

などで満たされます。

Chrisは試験を終了しませんでしたが、100番目の質問はヌルとして保存されています。したがって、各生徒は正確に100行ありますが、実際の回答はnullまたは文字です。

それは任意の違いを行った場合、答えはであり、{A、B、C、D、E、F}

この設定は、実際の試験の適用のための素晴らしい作品、及びそれをマーキングすることは簡単です。

今、私は監査目的のために、私はこのようになりますテーブルを生成する必要があることを、報告義務があります。

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

だから私はPIVOT機能について読んで半日を過ごした、と私はドンそれを手に入れません。

これは、私が今まで読んだことのない最も難解なドキュメントでなければなりません。

これは、機能が必要であり、集約しています - ここで集約されるはずのものは何ですか?

これはPIVOT関数が使用されている可能性が最も単純な使い方であることがわかりました。どこでもまともなサンプルを見つけることはできません。助けて!この記事では

答えて

1

OKがそれを解決しました。 MAXまたはMINはcharフィールドで機能します。 ので:

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

はもともと

を作成し、

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 

として混乱は何かを集約する論理的な理由がない集計の選択に産みます。私はStudentIDとQuestionIDが複合キーを形成するので、与えられたSIDとQIDのペアに対しては1つのAnswer値しかありません。

3

ルック: Using PIVOT and UNPIVOT

引用:

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> 

あなたは集計関数(列が集約されている)が存在する必要があります見ることができるように。 テーブルのAnswer列は、char(1)ではなく整数(10進数など)でなければなりません。

EDIT:MIN()およびMAX()はchar()データ型で動作します。

あなたのテーブルには、このようにすることができます:あなたが必要となります結果を与えるPIVOTと

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

そしてSELECT文:

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

回答は手紙です。それはintではありません。私は手紙をAVGすることはできません。私はSUMを一つにすることはできません、私はCOUNTを望んでいません。手紙が「a」なら、私は「a」を見たいと思う。なぜこれは難しいのですか? –

+0

ピボット句には集計関数が必要ですが、集計関数(しかし必要のないCOUNT()は数値データ型に対してのみ機能します)。 –

+0

あなたは正しい方向に向かいました。この場合、解決策はMAXまたはMINを使用することです。 –