2013-04-15 2 views
0

내 상황은 이것이다 :SQL 서버 트랜스는 (아마도 피벗?) 여러 행을 하나 개의 컬럼에

나는 76 개 질문 (열) 응답 (400) 사용자 (행)와 설문 조사를합니다. 이 사용자는 이미 데이터베이스에 ID를 가지고 있습니다. 회사 당 질문이 포함 된 표를 만들었고 각 질문마다 자체 ID가 있습니다. 이제는 사용자 ID 별 답변과 질문 ID를 혼용해야합니다. 감사합니다,

User ID | Question ID 1 | Question ID 2 | Question ID 3 | etc... 
xxxxxx | xxxxx   | xxxxx   | xxxxx   | ... 

모든 모든 도움은 감사 :

User ID | Question ID | Answer 
xxxxxxx | xxxxxxxxxxxxx | xxxxxxxxxx 

대신에 : 나는 가져올 때

은 열 머리글이 있어야합니다.

+0

아직 피벗 쿼리로 쓰려고 했습니까? – Limey

+0

답변 가져 오기를 언급합니다. 벌써 해 봤니? 그렇지 않은 경우 데이터베이스로로드하기 전에 데이터를 조 변경하십시오. Excel과 같은 작업을 쉽게 수행 할 수 있습니다. – BellevueBob

+0

이 시점까지 지금까지 내가 해왔지만 너무 많은 사용자가있어 사용자 ID를 답변에 할당하는 데 영원히 걸릴 것입니다. 필자는 피벗 테이블을 통해이를 수행하는 방법을 찾고 있었지만 아직 계층 구조를 제거 할 수는 없습니다. – user2187945

답변

1

데이터를 언 피 보트 (unpivot)하려는 것 같습니다. 이 작업은 SQL Server의 버전에 따라 여러 가지 방법으로 수행 할 수 있습니다. 당신은 SQL 서버 2005 +를 사용하는 경우

, 당신은 행에 열을 변환 UNPIVOT 기능을 사용할 수 있습니다 : 당신이 SQL 서버 2008+를 사용하는 경우

select userid, questionid, answer 
from yourtable 
unpivot 
(
    answer 
    for questionId in (QuestionId1, QuestionId2) 
) unpiv; 

, 당신은 UNPIVOT 기능을 사용할 수 있지만 당신은 당신이 행으로 변환 할 필요가 열 알 수없는 번호가 있다면, 당신은을 얻기 위해 동적 SQL을 사용할 수

select t.userid, c.questionid, c.answer 
from yourtable t 
cross apply 
(
    values 
    ('QuestionId1', QuestionId1), 
    ('QuestionId2', QuestionId2), 
    ... 
) c (questionId, answer); 

을 : 당신은 또한 CROSS이 적용 사용할 수 있습니다 및 값은 행 열에서 데이터를 변환하는 검색 결과 :

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsUnpivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('yourtable') and 
       C.name != 'userid' 
     for xml path('')), 1, 1, '') 

set @query 
    = 'select userid, questionid, answer 
    from yourtable 
    unpivot 
    (
     answer 
     for questionid in ('+ @colsunpivot +') 
    ) u' 

exec(@query); 

이 변환 유형을 수행 할 때 행으로 변환되는 열의 데이터는 동일한 데이터 유형이어야합니다. Question1 및 Question2 다른 데이터 유형 인 경우 예를 들어, 당신은이에 UNPIVOT 유사한하기 전에 변환해야합니다 :

select userid, questionid, answer 
from 
(
    select userid, 
    cast(questionid1 as varchar(10)) questionid1, 
    cast(questionid2 as varchar(10)) questionid2 
    from yourtable 
) src 
unpivot 
(
    answer 
    for questionId in (QuestionId1, QuestionId2) 
) unpiv; 
당신은 MSSQL 2005 또는 더 높은 UNPIVOT 사용할 수 있습니다
1

:에서

SELECT [User ID], [Question ID], [Question Reponse] 
FROM 
    (SELECT [User ID], [Question 1], [Question 2] 
    FROM pvt) p 
UNPIVOT 
    ([Question Reponse] FOR [Question ID] IN 
     ([Question 1], [Question 2]) 
)AS unpvt; 

:

,617,451 : [사용자 ID] [1 질문] VARCHAR (100) [질문 2] VARCHAR (100)

결과 을 int로

| USER ID | QUESTION ID | QUESTION REPONSE | 
-------------------------------------------- 
|  1 | Question 1 |    Blah | 
|  1 | Question 2 |   BlahBlah | 
|  2 | Question 1 |   MoreBlah | 
|  3 | Question 1 |  No Response | 
|  3 | Question 2 |    Else | 

SQL Fiddle

관련 문제