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
'programing' 카테고리의 다른 글
| 'as const'를 유형과 결합하시겠습니까? (0) | 2023.06.09 | 
|---|---|
| Oracle 정규식에서 탐욕스럽지 않은 정량자가 작동하지 않는 이유는 무엇입니까? (0) | 2023.06.09 | 
| ExecuteBatch 메서드가 Java에서 값 -2의 배열을 반환합니다. (0) | 2023.06.09 | 
| strtol의 올바른 사용 (0) | 2023.06.09 | 
| 'sudogem install' 또는 'sudogem install' 및 gem 위치 (0) | 2023.06.04 | 

