2009-04-24 2 views
1

Источник таблицы:SQL PIVOT сервера справки

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-й вопрос хранится как null, поэтому гарантируется, что каждый ученик имеет ровно 100 строк, но фактический ответ равен null или символу.

Если это делает никакой разницы, ответы в {а, Ь, с, d, е, е}

Эта установка отлично работает для практического применения экзамена и маркировки тривиально.

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

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.

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> 

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

EDIT: MIN() и MAX() работают для char() тип данных.

Ваша таблица может выглядеть так:

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

И ЗЕЬЕСТ с 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 
+0

Ответ Письмо. Это не int. Я не могу получить письмо AVG. Я не могу SUM один, мне не нужен COUNT. Если письмо «a», я хотел бы видеть «a». Почему это так сложно? –

+0

pivot clause требуется агрегатная функция, но агрегированные функции (но COUNT(), которые вам не нужны) работают только для числовых типов данных. –

+0

Хорошо, вы заставили меня двигаться в правильном направлении. Решение состоит в том, чтобы использовать MAX или MIN в этом случае. –