복붙노트

[SQL] 오라클에서 동적으로 행을 열로 회전식

SQL

오라클에서 동적으로 행을 열로 회전식

나는 다음과 같은 오라클 10g 테이블이라고 _kv 있습니다 :

select * from _kv

ID       K       V
----     -----   -----
  1      name    Bob
  1      age     30
  1      gender  male
  2      name    Susan
  2      status  married

내가 일반 SQL을 사용하여 열로 내 키를 설정하고 싶습니다 (안 PL / SQL) 결과 테이블이 다음과 같이 보일 것이다 그래야 :

ID       NAME    AGE    GENDER  STATUS
----     -----   -----  ------  --------
  1      Bob      30     male 
  2      Susan                   married

이 당신이 당신의 피벗 열을 호출 할 수 있습니다 무엇을 알고있는 경우에 거기 예제를 많이하지만, 난 그냥 오라클에 대한 일반적인 회전 솔루션을 찾을 수 없습니다.

감사!

해결법

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

    1.오라클 11g는 당신이 원하는 않는 피벗 동작을 제공한다.

    오라클 11g는 당신이 원하는 않는 피벗 동작을 제공한다.

    오라클 11g 솔루션

    select * from
    (select id, k, v from _kv) 
    pivot(max(v) for k in ('name', 'age', 'gender', 'status')
    

    (참고 : 나는 그것의 기능을 확인하지 않은, 그래서 난에이를 테스트하는 11g의 사본이없는)

    나는이 솔루션에서 얻은 : http://orafaq.com/wiki/PIVOT

    편집 - 피벗 XML 옵션 (오라클 11g) 분명히 또한 당신이해야 할 수도 있습니다 모든 가능한 열 제목을 모를 때의 피벗 XML의 옵션이 있습니다. (http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html에있는 페이지의 아래쪽에 XML 유형 섹션 참조)

    select * from
    (select id, k, v from _kv) 
    pivot xml (max(v)
    for k in (any) )
    

    (참고 : 나는 그것의 기능을 확인하지 않도록 나는에 이것을 테스트하는 11g의 사본이없는 전)

    EDIT2 : 최대로 피벗 및 피벗 XML 문에서 변경된 V (V) 의견 중 하나에서 언급 한 바와 같이이 집계하도록되어 있기 때문이다. 또한 피벗에 대한 선택되지 않습니다에 절을 추가했다. 물론, 절에서이 질문의 포스터의 욕망이었다로 완전히 동적 피벗 / 크로스 탭 쿼리를 가지고 목표를 패배의 값을 지정할 필요.

  2. ==============================

    2.여러 값 (귀하의 예제에서 V), 내가 사용하는 PIVOT과 LISTAGG의 가능성이있는 상황에 대처하려면 :

    여러 값 (귀하의 예제에서 V), 내가 사용하는 PIVOT과 LISTAGG의 가능성이있는 상황에 대처하려면 :

    SELECT * FROM
    (
      SELECT id, k, v
      FROM _kv 
    )
    PIVOT 
    (
      LISTAGG(v ,',') 
      WITHIN GROUP (ORDER BY k) 
      FOR k IN ('name', 'age','gender','status')
    )
    ORDER BY id;
    

    동적 값을 사용하여 동적 SQL을 원하는 값을 전달하기 때문에 피벗 문을 호출하기 전에 테이블 데이터에 대한 선택을 실행하여 결정.

  3. ==============================

    3.피벗에서 작업을하는 일. 나를 위해 작품 아래 11g에 지금 테스트로 :

    피벗에서 작업을하는 일. 나를 위해 작품 아래 11g에 지금 테스트로 :

    select * from
    (
      select ID, COUNTRY_NAME, TOTAL_COUNT from ONE_TABLE 
    ) 
    pivot(
      SUM(TOTAL_COUNT) for COUNTRY_NAME in (
        'Canada', 'USA', 'Mexico'
      )
    );
    
  4. ==============================

    4.우선, 다시 피벗 XML을 사용하여 동적으로 피벗 구문 분석 할 필요가있다. 우리는 변수에 열 이름을 저장하고 아래와 같이 동적 SQL에서 그들을 전달하여이 일을하는 또 다른 방법이있다.

    우선, 다시 피벗 XML을 사용하여 동적으로 피벗 구문 분석 할 필요가있다. 우리는 변수에 열 이름을 저장하고 아래와 같이 동적 SQL에서 그들을 전달하여이 일을하는 또 다른 방법이있다.

    우리는 다음과 같은 테이블이 좋습니다.

    우리는 수량에서 해당 열에서 열 이름과 열 YR의 값과 값을 표시해야하는 경우, 우리는 아래의 코드를 사용할 수 있습니다.

    declare
      sqlqry clob;
      cols clob;
    begin
      select listagg('''' || YR || ''' as "' || YR || '"', ',') within group (order by YR)
      into   cols
      from   (select distinct YR from EMPLOYEE);
    
    
      sqlqry :=
      '      
      select * from
      (
          select *
          from EMPLOYEE
      )
      pivot
      (
        MIN(QTY) for YR in (' || cols  || ')
      )';
    
      execute immediate sqlqry;
    end;
    /
    

    결과

  5. from https://stackoverflow.com/questions/7730111/pivoting-rows-into-columns-dynamically-in-oracle by cc-by-sa and MIT license