oracle unpivot 예제

로랑 슈나이더는 최고의 오라클 SQL 전문가 중 한 명으로 꼽히며, 만연한 테크프레스의 “고급 SQL 프로그래밍”이라는 책의 저자입니다. 다음은 이 책에서 발췌한 내용이다. “뉴욕”이라는 열이 갑자기 행의 값이 되면서 어떤 열 아래에 값 33048을 표시하시겠습니까? 해당 질문은 위의 쿼리에서 피벗 되지 않은 연산자 내부의 for 절 바로 위의 절에 의해 대답 됩니다. state_counts를 지정하면 결과 출력에서 생성된 새 열의 이름입니다. Oracle Database 11g 이전에는 각 값에 대한 일종의 디코딩 함수를 통해 이를 수행하여 각 고유 값을 별도의 열로 작성합니다. 그러나 이 기술은 매우 직관적이지 않습니다. 여기서 “뉴욕”, “Conn” 등의 값이 state_code라고 하는 피벗되지 않도록 하려는 새 열의 값이라고 지정했습니다. 원본 데이터의 일부 살펴보기: 피벗 및 피벗 해제 작업에 대한 자세한 내용은 Oracle Database 11g SQL 언어 참조를 참조하십시오. 내가 그것을 읽을 때 내 첫 번째 생각은 “행으로 열”이었다, 그 상대적으로 새로운 unpivot 절에 대한 작업처럼 들린다. 그것은 내가 절에 대한 “실제”요구 사항을 우연히 만난 첫 번째 시간이었기 때문에 필요에 따라 작동할 것이라는 자신을 만족시키기 위해 빠른 테스트를 실행하는 것을 거부 할 수 없었습니다. 다음은 몇 가지 시작 데이터를 만든 방법: 약간의 조정으로 솔루션이 합리적으로 성공했습니다: OP는 원래 데이터가 두 개의 서로 다른 데이터로 구성되었기 때문에 원래 쿼리를 unpivot 절이 있는 두 개의 집계된 하위 쿼리로 유니온 으로 전환했습니다.

형식(쿼리 중 하나에는 UNION ALL이 동일한 ORA-01790을 얻지 않도록 집계 한 후 필요한 변환 함수가 포함되었습니다. 수치와 함께 이메일을 잃어 버렸지만 UNION all이 27 개의 하위 쿼리에서 2 개의 하위 쿼리로 떨어지면서 런타임이 1 분 50 초에서 40 초로 떨어졌다고 생각합니다. ORA-01790에 대한 OP의 반응은 물론 매우 흥미로웠으며 다른 가능성을 고려해야 할 필요성을 잘 보여주는 것입니다. 그의 해결 방법을 통해 UNION ALL의 한 부분이 숫자 열의 피벗되지 않은 부분과 문자 열의 피벗 해제인 재작성이 포함되었습니다. 내 데이터 세트에 두 번째 날짜 열 (date4)을 추가하면 결과 쿼리가 다음과 같이 형성됩니다.이 예제에서는 UNPIVOT 작업의 유용성을 설명하기 위해 크게 두려워하지 않습니다. 데이터 디자인이 우리가 원하는 대로 정규화되지 않았을 때, 그리고 우리가 집계에 선호하는 트랜잭션 형식이 아니라 각 행에 여러 개의 열이 붙어 있다고 생각합니다. 일반적인 예로는 매월 또는 그 달의 각 일 또는 몇 가지 고정 된 시간에 대한 열이있는 레코드가 있습니다 . 값을 입력하는 화면이 행렬처럼 보이면 테이블에 이러한 열 레이아웃이 너무 자주 있습니다. 또한 데이터 작업은 예상보다 어렵습니다. UNPIVOT를 입력합니다. 이것은 내가 실행 한 첫 번째 예제에서 아니었다 – 처음에 나는 모든 열이 숫자인 데이터 세트를 만들었지 만, 질문의 발신자에게 그 예를 전달 한 후 나는 트렁크는 다음과 같이 위에서 볼 수있는 date3 열에 원래의 col3 열이었던 것을 변경했습니다. sysdate)를 정의 식에 넣습니다.

여기, 다음, 원리를 보여 줄 수 있도록 쓴 코드 – 먼저 그 결과와 함께 작업 버전을 실패하는 간단한 버전 : 글쎄, 피벗 연산에 또 다른 절이있다, XML, 당신은 당신이 지정 할 수있는 XML로 피벗 출력을 만들 수 있습니다 fy 는 리터럴 값 대신 특수 조항 인 ANY를 참조하십시오. 다음은 피벗 작업이 고급 SQL 쿼리에 대해 이야기할 때 자주 설명합니다. 피벗은 행과 열을 전환하는 프로세스이며, 예를 들어 Excel의 고급 기능입니다. Oracle 11g 이전에는 오라클 SQL 언어에서 PIVOT 연산자가 부족하여 해결 방법이 없었던 피벗에 대한 몇 가지 접근 방식이 있었습니다.