본문 바로가기
SQL(쿼리)

GROUP BY 컬럼의 변형

by 취미툰 2020. 11. 9.
반응형

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

댓글