2014-04-23 2 views
0

방금 ​​SQL을 배우기 시작했으며 세 개의 열 테이블을 올바르게 바꾸는 데 어려움을 겪고 있습니다.SQL Server 2008 - 하나의 열을 다른 열로 그룹화하고 세 번째 열에 대한 참조 유지

여기 내 출발점 :

questionid | DebriefingQuestionResults | OperationSessionRecordID 
------------------------------------------------------------------ 
32   |  3     | 8071 
34   |  0     | 8071 
36   |  1     | 8071 
32   |  2     | 8074 
34   |  6     | 8074 
36   |  5     | 8074 

그리고 여기에 내가 생산하고자하는 내용은 다음과 같습니다

OperationSessionRecordID | 32 | 34 | 36 
---------------------------------------------- 
    8071      | 3 | 0 | 1  
    8074      | 2 | 6 | 5 

있습니다 단지 세 [questionid] 값 (32, 34, 36), 그러나 약 12000 [OperationSessionRecordID] 값입니다. 모든 열의 유형은 int not null입니다.

은 내가 [OperationSessionRecordID]에 의해 내 입력 테이블 그룹에서 [questionid]에/피벗 피벗 해제 할 필요가 알고 있지만, 나는 여전히 붙어 numerousotherquestions 보았다 데.

this answer을 기반으로합니다. 단 하나의 테이블로 작업 중이므로 내부 조인이 필요하지 않으므로 진행 방법을 잘 모릅니다.

SELECT [32], [34], [36] 
FROM 
(
    SELECT A.questionid, A.DebriefingQuestionResults 
    , row_number() over(partition by a.OperationSessionRecordID) 
    FROM dbo.TEMPtable AS A 
) AS P 
PIVOT 
(
    min(P.Value) 
    for P.questionid in ([32], [34], [36]) 
) AS PIV; 

이 코드를 실행하면이 오류가 발생하므로 row_number를 사용하면 문제가 발생합니다. 순위 기능 "ROW_NUMBER는"ORDER BY 절이 있어야합니다 6 호선 메시지 (4112)

, 수준 15, 상태 1,.

모든 도움을 주시면 감사하겠습니다.

SB

+0

에 의해 분할 후 괄호를 닫습니다. – Mihai

+0

@Mihai 아, 네 좋은 지적이야! 그것을 반영하기 위해 편집 됨. –

답변

2

이것은 매우 간단합니다. 그냥 : - 본질적이 아닌 PIVOT에 언급 된 모든 열이 그룹화 열이

SELECT OperationSessionRecordID, [32],[34],[38] 
FROM TEMPtable 
    PIVOT (
    min(DebriefingQuestionResults) 
    for questionid in ([32], [34], [36]) 
) AS PIV; 

당신은 OperationSessionRecordID에 의해 그룹화를 얻을 특별한 작업을 수행 할 필요가 없습니다.

+0

건배는 내가 원하는만큼 정확하게 작동합니다. PIVOT 기능을 설명해 주셔서 감사합니다. –

1

시도하십시오 :

select 
    * 
From(
     select * From tbl 
    )x pivot 
    (
     min(DebriefingQuestionResults) for questionid in ([32],[34],[36]) 
    )piv 
+1

고마워요. 완벽하게 작동합니다. 다른 답변을 받아 들였습니다. 그 이유는 무엇이며, 왜 그 형식으로되어 있어야하는지에 대한 설명이 조금 더 있습니다. SB :) –

관련 문제