반응형
GROUP BY에 컬럼을 정의할 때 컬럼을 변형할 수 있습니다.
TO_CHAR,TO_DATE와 같은 오라클 기본함수 뿐만 아니라, CASE(또는 DECODE)와 같은 치환 문법도 사용할 수 있습니다.
문자와 문자를 결합하거나 산술연산도 할 수 있습니다.
--GROUP BY에 CASE를 사용한 예
select 지불방법
,case when 지불금액 >= 5000 then 'High'
when 지불금액 >= 3000 then 'Middle'
else 'Low'
end 지불금액_TEMP
,count(*) 주문수
from 주문테이블
group by 지불방법,
,case when 지불금액 >= 5000 then 'High'
when 지불금액 >= 3000 then 'Middle'
else 'Low'
end
order by 1,2;
CASE를 활용해 금액이 5000이상이면 High, 3000이상 5000미만이면 Middle, 그 외에는 Low로 분류하였습니다.
또한, CASE는 Order by에도 사용할 수 있습니다!
--TO_CHAR 변형을 이용한 GROUP BY
select to_char(주문날짜,'YYYYMM') 주문년월, 지불방법
,count(*) 주문수
from 주문테이블
group by to_char(주문날짜,'YYYYMM'),지불방법
order by to_char(주문날짜,'YYYYMM'),지불방법;
집계함수에서 CASE문 활용
집계함수의 괄호 안에서도 CASE문을 사용할 수 있습니다. 이를 이용해서 CASE조건에 따라 집계를 수행할 수 있고 로우데이터를 컬럼으로 출력할 수 있습니다.
아래의 쿼리는 주문년월 별로 BANK 와 CARD의 건수를 조회하는 쿼리입니다.
--집계함수(SUM)에서 CASE문 활용
select to_char(주문날짜,'YYYYMM') 주문년월
,SUM(CASE WHEN 지불방법='BANK' then 1 end) bank_cnt
,SUM(CASE WHEN 지불방법='CARD' then 1 end) card_cnt
from 주문테이블
group by to_char(주문날짜,'YYYYMM')
order by to_char(주문날짜,'YYYYMM');
CASE 문을 보면 지불방법이 BANK인 경우는 1을 치환하고 ELSE를 정의하지 않았기 때문에 NULL로 치환됩니다.
집계함수로 SUM 대신 COUNT를 사용하여도 같은 결과를 확인할 수 있습니다.
CASE를 활용하여 피벗기능 사용
오라클의 경우에는 11g부터 PIVOT명령어를 지원하긴 하지만 PIVOT을 지원하지 않는 DBMS도 많이 때문에 기본적으로 어떤식으로 되는지 만드는 방법을 알아두면 쿼리를 짜는데 도움이 많이 될 것같습니다.
위와 같은 결과를 보여주는 쿼리이고 가로 세로 값만 바뀐 결과를 보여줍니다.
--CASE문으로 PIVOT 사용
select 지불유형
,count(case when to_char(주문날짜,'YYYYMM')='201701' then 'X' end) 주문날짜_1701
,count(case when to_char(주문날짜,'YYYYMM')='201702' then 'X' end) 주문날짜_1702
,count(case when to_char(주문날짜,'YYYYMM')='201703' then 'X' end) 주문날짜_1703
from 주문테이블
group by 지불유형
order by 지불유형;
반응형
'SQL(쿼리)' 카테고리의 다른 글
SCOTT스키마예제를 통해 계층구조 쿼리 정리 (0) | 2020.11.25 |
---|---|
ROLLUP을 대신하는 방법 (0) | 2020.11.24 |
ROLLUP (0) | 2020.11.20 |
COUNT 집계함수 (0) | 2020.11.11 |
GROUP BY (0) | 2020.11.02 |
댓글