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 |