복붙노트

[SQL] SQL Server 2008의 PIVOT을 사용하여

SQL

SQL Server 2008의 PIVOT을 사용하여

하자 내가 SQL Server 2008의 테이블 또는 [표] -typed 변수 중 일부 데이터를 가지고 말 :

author_id     review_id     question_id     answer_id
88540         99001         1               719
88540         99001         2               720
88540         99001         3               721
88540         99001         4               722
88540         99001         5               723
36414         24336         1               302
36414         24336         2               303
36414         24336         3               304
36414         24336         4               305
36414         24336         5               306

나는 결과 집합으로 데이터를 검색 할 것을 다음과 같다 :

author_id     review_id     1     2     3     4     5
88540         99001         719   720   721   722   723
36414         24336         302   303   304   305   306

나는 PIVOT 연산자 내가 (이 게시물 어쨌든에 따라)해야 할 것입니다 생각,하지만 난 테이블에 question_id 행의 수는 달라질 수 있습니다 특히, 시작하는 방법을 알아낼 수 없습니다. 위의 예에서, 그것은 5,하지만 다른 쿼리 테이블 7 개 별개의 문제로 채울 수 있습니다.

해결법

  1. ==============================

    1.사실, 당신은 클라이언트에서이 일을 더 나을 것입니다. 중간에 열 그룹에 author_id 및 REVIEW_ID 행 그룹, question_id으로, 첫 번째 결과 집합에 따라 데이터를 얻을 행렬을 사용하여 표시, 당신이보고 서비스를 사용한다고 가정하고, MAX (answer_id).

    사실, 당신은 클라이언트에서이 일을 더 나을 것입니다. 중간에 열 그룹에 author_id 및 REVIEW_ID 행 그룹, question_id으로, 첫 번째 결과 집합에 따라 데이터를 얻을 행렬을 사용하여 표시, 당신이보고 서비스를 사용한다고 가정하고, MAX (answer_id).

    쿼리는 가능 하죠,하지만 당신은 지금 동적 SQL이 필요한 것입니다.

    ... 뭔가 같은 :

    DECLARE @QuestionList nvarchar(max);
    SELECT @QuestionList = STUFF(
    (SELECT ', ' + quotename(question_id)
    FROM YourTable
    GROUP BY question_id
    ORDER BY question_id
    FOR XML PATH(''))
    , 1, 2, '');
    
    DECLARE @qry nvarchar(max);
    SET @qry = '
    SELECT author_id, review_id, ' + @QuestionList + 
    FROM (SELECT author_id, review_id, question_id, answer_id
          FROM YourTable
         ) 
    PIVOT
    (MAX(AnswerID) FOR question_id IN (' + @QuestionList + ')) pvt
    ORDER BY author_id, review_id;';
    
    exec sp_executesql @qry;
    
  2. ==============================

    2.여기 좋은 예와 설명이있다.

    여기 좋은 예와 설명이있다.

    귀하의 경우는 다음과 같이 될 것이다 :

    SELECT author_id, review_id, [1], [2], [3], [4], [5]
    FROM 
        (
            SELECT author_id, review_id, question_id, answer_id
            FROM the_table
        ) up
    PIVOT (MAX(answer_id) FOR question_id IN ([1],[2],[3],[4],[5])) AS pvt
    
  3. ==============================

    3.

    SELECT author_id, review_id, [1], [2], [3], [4], [5]
    FROM 
        (
            SELECT author_id, review_id, question_id, answer_id
            FROM the_table
        ) up
    PIVOT (MAX(answer_id) FOR
    
  4. ==============================

    4.

    select * 
    from @t pivot
    (
        max(answer_id) for question_id in ([1],[2],[3],[4],[5])
    ) pivotT
    

    목록 달라질 수있는 유일한 방법 ([1], [2], [3], [4], [5]) (동적으로) 문자열이 쿼리를 작성하고이를 실행하는 것이다.

  5. ==============================

    5.이 답변을 참조하십시오

    이 답변을 참조하십시오

    기본적으로, 당신은 열을 얻을 수있는 데이터를 미리 검사하고 동적으로 동적 피벗 목록을 사용하여 SQL을 생성합니다. 수익을 원하는 세트의 열 정의가 고정되지 않기 때문에 더 비 동적 방법은 정말 없습니다.

  6. from https://stackoverflow.com/questions/1677645/using-pivot-in-sql-server-2008 by cc-by-sa and MIT license