[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.오라클 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.여러 값 (귀하의 예제에서 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.피벗에서 작업을하는 일. 나를 위해 작품 아래 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.우선, 다시 피벗 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; /
결과
from https://stackoverflow.com/questions/7730111/pivoting-rows-into-columns-dynamically-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 모든 맥주를 여러 TSOLUMNS (0) | 2020.04.01 |
---|---|
[SQL] 벌크는 SQL Server 2008에서 삭제 (삭제 데이터를 대량 복사 (BCP와 같은이 무엇이든)인가?) (0) | 2020.04.01 |
[SQL] ERROR 1148 : 사용 된 명령이 MySQL 버전과 함께 사용할 수 없습니다 (0) | 2020.04.01 |
[SQL] SQL ROWNUM 어떻게 특정 범위 사이에 행을 반환합니다 (0) | 2020.04.01 |
[SQL] CodeIgniter의 액티브 레코드 패턴 UNION 쿼리 (0) | 2020.04.01 |