now is better than never
[Oracle] PIVOT ROUND, IN 서브쿼리 본문
- 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도 못쓰고 제약을 만들어 놓았는지 ...
본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.
'SQL > 프로젝트' 카테고리의 다른 글
[Oracle] 서울 버거체인점 데이터 분석하기 (1) | 2022.12.22 |
---|---|
[Oracle] 서울 커피전문점 데이터 분석하기 (0) | 2022.12.19 |
[Oracle] 공공데이터 서울 상가(상권)정보 분석하기 3 (0) | 2022.12.08 |
[Oracle] SELECT 모든 컬럼(*)에 다른 컬럼 추가하기 (0) | 2022.12.08 |
[Oracle] 서울 커피체인점 비교하기 - group by decode / case when (0) | 2022.12.08 |