now is better than never

[Oracle] PIVOT ROUND, IN 서브쿼리 본문

SQL/프로젝트

[Oracle] PIVOT ROUND, IN 서브쿼리

김초송 2022. 12. 12. 17:44
  • PIVOT ROUND

컬럼 하나하나 씩 ROUND를 적용하면 된다...^^ 물론 *는 어림도 없다! 

 

그런데

SELECT ROUND(PRESIDENT), ROUND(MANAGER), ROUND(SALESMAN), ROUND(CLERK), ROUND(ANALYST)
FROM (SELECT job, sal FROM emp)
pivot (avg(sal) FOR job IN ( 'PRESIDENT', 'MANAGER', 'SALESMAN', 'CLERK', 'ANALYST'));

이러면 부적합한 식별자라고 에러가 뜨는데 이유는 컬럼명에 ' ' 이 붙기 때문이다!

해결 방법은 별칭을 추가하는 방법!

SELECT ROUND(PRESIDENT), ROUND(MANAGER), ROUND(SALESMAN), ROUND(CLERK), ROUND(ANALYST)
FROM (SELECT job, sal FROM emp)
pivot (avg(sal) FOR job IN ( 'PRESIDENT' PRESIDENT, 'MANAGER' MANAGER, 'SALESMAN' SALESMAN
						, 'CLERK' CLERK, 'ANALYST' ANALYST));

아니면 컬럼명이 숫자인 경우는 컬럼명을 " " 로 둘러싸면 된다

SELECT ROUND("10")
	, ROUND("20")
	, ROUND("30")
FROM (SELECT deptno, sal FROM emp)
pivot (AVG(sal) FOR deptno IN (10, 20, 30));

ROUND 전 PIVOT문 결과 비교

별칭 추가 전
별칭 추가 후

 

  • PIVOT IN subquery

결론부터 말하면 불가능하다...!

select listagg(DISTINCT 상권업종대분류명, ', ') column_name
from market_2022;

-- 별칭 추가 버전
select listagg(DISTINCT ''''||상권업종대분류명||''' '|| 상권업종대분류명, ', ') column_name
from market_2022;

의 결과를 복사해서

select *
from (
    select 시군구명, 상권업종대분류명
    from market_2022
)
PIVOT ( count(*) for 상권업종대분류명 IN (  ))
order by 시군구명;

IN 뒤의 괄호 안에 넣어주는 방법이 나에게 가장 빠른 방법이다...!ㅋㅋ 충격

 

검색해보면 PIVOT XML, dynamic sql 라는 방법이 나오지만 xml은 다시 파라미터를 찾아야 하는 귀찮음이... (쿼리 두 번 날리는 것보다는 덜 귀찮긴 할듯 ㅠㅋㅋ)

 

오라클은 왜 함수를 이렇게 만들어놔서 원래 IN 안에되던 서브쿼리도 PIVOT에선 못하고 round도 못쓰고 제약을 만들어 놓았는지 ... 

 

본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.