programing

Oracle에서 행을 열로 동적으로 피벗

javamemo 2023. 6. 9. 21:41
반응형

Oracle에서 행을 열로 동적으로 피벗

_kv라는 Oracle 10g 테이블이 있습니다.

select * from _kv

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

PL/SQL이 아닌 일반 SQL을 사용하여 키를 열로 변환하여 결과 테이블을 다음과 같이 만들고 싶습니다.

ID       NAME    AGE    GENDER  STATUS
----     -----   -----  ------  --------
  1      Bob      30     male 
  2      Susan                   married
  • 에는 고유 열 .K테이블에 존재함(그렇게 많지 않음)
  • 쿼리를 실행하기 전에 어떤 열이 있는지 알 수 없습니다.
  • 프로그램적으로 최종 쿼리를 작성하기 위해 초기 쿼리를 실행하는 것을 피하려고 합니다.
  • 빈 셀은 null이거나 빈 문자열일 수 있으며, 실제로는 중요하지 않습니다.
  • 저는 Oracle 10g을 사용하고 있지만 11g 솔루션도 괜찮을 것 같습니다.

피벗 열을 뭐라고 부르는지 아는 경우에 대한 예는 많이 있지만 오라클용 일반 피벗 솔루션을 찾을 수 없습니다.

감사합니다!

는 Oracle 11g을 합니다.PIVOT당신이 원하는 것을 하는 작전.

Oracle 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 에서 얻었습니다.

EDIT -- 피벗 xml 옵션 (Oracle 11g 도포)
보아하니 거기에도 또한 있습니다.pivot xml필요한 가능한 열 제목을 모두 알지 못하는 경우에 대한 옵션입니다.(http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html) 에 있는 페이지 하단의 XML TYPE 섹션을 참조하십시오.

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

(참고: 이전과 마찬가지로 이것을 테스트할 11g 복사본이 없어서 기능을 확인하지 않았습니다.)

편집 2: 변경됨v에 시대에pivot그리고.pivot xml에한대진에 대한 max(v)댓글 중 하나에 언급된 것처럼 집계되어야 하기 때문입니다.는 추습다니했가또한▁the▁added다▁also도 추가했습니다.in 선항이아 절닌사에 대한 절pivot 론물, 값지야에 .in절은 이 질문의 포스터가 원했던 것처럼 완전히 동적인 피벗/피벗 탭 쿼리를 갖는 목표를 좌절시킵니다.

값이 이 있는 v)을 여값가의예있상처위리황기사다해니용합하을는러능이성예▁v(▁to다사▁i니위용합해(v: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을 사용하고 피벗 문을 호출하기 전에 테이블 데이터에서 선택을 실행하여 결정된 값을 전달합니다.

피벗에 작업이 있습니다.아래는 방금 11g에서 테스트한 것과 같이 작동합니다.

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

우선, 동적으로 피벗(pivot)을 사용합니다.pivot xml다시 구문 분석해야 합니다.열 이름을 변수에 저장하고 아래와 같이 동적 SQL에 전달하는 다른 방법이 있습니다.

아래와 같은 테이블이 있다고 생각합니다.

여기에 이미지 설명 입력

열에 값을 표시해야 하는 경우YR열 이름 및 해당 열의 값으로 지정합니다.QTY그러면 우리는 아래 코드를 사용할 수 있습니다.

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;
/

결과

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/7730111/pivoting-rows-into-columns-dynamically-in-oracle

반응형