sum(합을 구하는 함수), decode(치환하는 함수)를 이용해서 그룹별 단순화해보자.
예를 들어, 학과별 자퇴자 명단을 구해보면
select dept, count(sno)
from student
where code = '자퇴'
group by dept;
결과는
dept | count(sno) |
국문과 | 3 |
영문과 | 2 |
철학과 | 5 |
근데 주야간으로 구분해야 한다.
select dept, div_dn, count(sno)
from student
where code = '자퇴'
group by dept, div_dn; 으로 조회하면 아래와 같이 나오는데
dept | div_dn | count(sno) |
국문과 | 주간 | 2 |
국문과 | 야간 | 1 |
영문과 | 주간 | 0 |
영문과 | 야간 | 2 |
... | ... | ... |
이런 식으로 같은 과에서 주야별로 나눠져서 나온다. 내가 원한건 아래와 같다.
dept | 주간 | 야간 | count(sno) |
국문과 | 2 | 1 | 3 |
영문과 | 0 | 2 | 2 |
이렇게 하려면 sum과 decode를 활용하면 쉽다.
sum(컬럼명)은 group으로 묶은 데이터 값의 합을 구하는 함수,
decode(컬럼명, 'A',1,0)은 컬럼에 A값이면 1로 치환 아니면 0으로 치환하는 함수
두 개의 함수를 활용하면
select dept, sum(decode(div_dn,'1',1,0) 주간), sum(decode(div_dn,'1',0,1) 야간), count(sno)
from student
where code = '자퇴'
group by dept, div_dn;
위에 표처럼 출력이 되는데
주야간을 구분하는 div_dn 칼럼은 주간이면 1, 야간이면 2로 입력이 되어 있다.
그래서 decode(div_dn,'1',1,0)을 하면 주간일 경우 1로 치환하고,
decode(div_dn,'1',0,1)을 하면 야간일 경우 1로 치환하고
sum(decode(div_dn,'1',1,0)을 하면 치환한 1값들을 모두 더해져서
주야간별로 깔끔하게 구할 수 있는 것이다.
'데이터베이스' 카테고리의 다른 글
[ORACLE] DB Link 설정 (0) | 2018.10.15 |
---|---|
두 날짜 사이의 날짜 구하기 (0) | 2018.01.02 |
오라클의 GREATEST, LEAST 함수 (0) | 2017.12.20 |
FIRST, LAST (최대, 최소값을 가진 로우 추출) (0) | 2017.12.15 |
피어슨 상관계수 SQL (0) | 2017.11.30 |