1

ソース テーブル:

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

そしてこれはで満たされます

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

など、約 500 名の学生を対象としています。

Chris は試験を終了しませんでしたが、100 番目の問題は null として保存されているため、各学生が正確に 100 行を持っていることが保証されますが、実際の答えは null または文字です。

違いがある場合、答えは{a、b、c、d、e、f}にあります

このセットアップは、実際の試験アプリケーションに最適であり、採点は簡単です。

ここで、監査目的で、次のような表を作成する必要があるというレポート要件があります。

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

そこで、PIVOT 関数について半日かけて読んだのですが、よくわかりませんでした。

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

1 つには、集約機能が必要です。ここで集約する必要があるのは一体何なのでしょうか。

これは PIVOT 関数の最も単純な使用法であり、適切な例はどこにも見つかりません。ヘルプ!

4

2 に答える 2

3

この記事を見てください: PIVOT と 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>

ご覧のとおり、集計関数 (集計される列) が必要です。したがって、テーブルの回答列は、char(1) ではなく、整数 (10 進数など) である必要があります。

編集: MIN() と MAX() は char() データ型で機能します。

テーブルは次のようになります。

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

そして、必要な結果を与える PIVOT を使用した 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
于 2009-04-24T23:57:40.637 に答える