2009-04-24 2 views
1

소스 테이블 :SQL 서버 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 번째 질문은 null로 저장되므로 각 학생의 행 수가 정확히 100 개이지만 실제 대답은 null 또는 문자로 보장됩니다. 그것은 어떤 차이가 있는지

, 응답은 {A, B, C, D, E는, F}

이 설정은 실제 시험 프로그램에 대해 잘 작동에 있고, 사소한 마킹.

는 지금은 감사 목적을 위해, 나는이 보이는 테이블 생성해야한다는 것을,보고 요구 사항이 :

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

그래서 나는 PIVOT 기능에 대한 책을 읽은 반나절 동안을, 나는 단지 돈 알았어.

나는 지금까지 읽지 못한 가장 통독할만한 문서 여야합니다.

기능과 기능이 필요합니다. 여기에 집계 할 대상은 무엇입니까?

필자는 이것이 가능한 PIVOT 기능의 가장 단순한 사용에 불과하다는 것을 알아 냈습니다. 어디에서도 괜찮은 예제를 찾을 수 없습니다. 도움! 이 문서에서

답변

1

확인을 해결했다. 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 쌍에 대해 하나의 가능한 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)이 아닌 정수 (소수점 등) 여야합니다.

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 할 수 없다. 나는 하나를 합칠 수 없다, 나는 COUNT를 원하지 않는다. 편지가 'a'인 경우, 'a'를보고 싶습니다. 왜 이렇게 어려운가요? –

+0

피벗 절에 집계 함수가 필요하지만 집계 함수 (그러나 필요하지 않은 COUNT())는 숫자 데이터 형식에서만 작동합니다. –

+0

좋아, 나에게 올바른 방향으로 갈거야, 해결책은이 경우에는 MAX 또는 MIN을 사용하는 것이다. –