Справка по SQL Server PIVOT - PullRequest
       22

Справка по SQL Server PIVOT

1 голос
/ 25 апреля 2009

Исходная таблица:

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 студентов.

Крис не закончил экзамен, но сотый вопрос сохраняется как нулевой, поэтому гарантируется, что у каждого ученика ровно 100 строк, но фактический ответ - ноль или символ.

Если это имеет какое-либо значение, ответы находятся в {a, b, c, d, e, f}

Эта настройка отлично подходит для реального экзаменационного приложения, и пометить ее тривиально.

Теперь у меня есть требование к отчетности, что для целей аудита мне нужно создать таблицу, которая выглядит следующим образом:

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

Так что я потратил полдня на чтение функции PIVOT, а я просто не понимаю.

Это должна быть самая непроницаемая документация, которую я когда-либо читал.

Во-первых, для этого требуется и функция агрегирования - какого черта я собираюсь здесь агрегировать?

Я полагаю, что это почти простейшее использование функции PIVOT, и я не могу найти достойного примера нигде. ПОМОГИТЕ!

Ответы [ 2 ]

3 голосов
/ 25 апреля 2009

Посмотрите на эту статью: Использование 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>

Как видите, должна быть функция агрегирования (агрегируемый столбец). Поэтому столбец ответа в вашей таблице должен быть целым (десятичным и т. Д.), А не символом (1).

РЕДАКТИРОВАТЬ: MIN () и MAX () работают для типа данных char ().

Ваш стол может быть таким:

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

И оператор SELECT с PIVOT, который даст нужный вам результат, будет:

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
1 голос
/ 27 апреля 2009

ОК решил это. 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 существует только одно возможное значение ответа.

...