본문 바로가기

Oracle/SQL

SQL 다중행 함수 - 그룹함수 (Count) 건수

COUNT (건수를 세는 함수)

count 또한 그룹함수이기때문에 null 값을 무시하고 계산해 준다.

→ null 값이 없는 컬럼을 기준으로 count 를 해주어야한다.

→ 만약 null값이 있는 컬럼으로 count 하게 되면 누락 된다. null 값을 세지 않기 때문.

그래서 제일 확실한 방법은 모든 컬럼 (*) 을 선택하면 확실하다.

select count(*)
from emp;

문제 : 직업이 세일즈 맨인 사원들이 몇명?

select count(*)
from emp 
where job = 'SALESMAN';

→ 웬만하면 * 을 쓰자!!

문제 : 우리반 통신사가 lg 인 학생들은 전부 몇명인지 카운트 출력

select count(*)
from emp14 
where lower(telecom) = 'lg';

문제 : 직업, 직업별 인원수 출력 , 세일즈맨 제외

select job, count(*) 
from emp
where job ≠ 'SALESMAN' 
group by job ;

문제 : 위결과를 다시 출력하는데 직업별 인원수가 높은것부터

select job, count(*)
from emp
where job != 'SALESMAN' 
group by job 
order by 2 desc;

문제 : 위의결과 다시 출력 직업별 인원수가 2명 이상인것 출력

select job, count(*) 
from emp 
where job != 'SALESMAN' 
group by job 
having count(*) >= 2 
order by 2 desc;

문제 : 우리반에서 나이, 나이별 인원수 출력 나이별 인원수가 높은것부터 출력

select age, count(*) 
from emp14 
group by age 
order by 2 desc;

문제 : 통신사, 통신사별 인원수 출력 통신사별 인원수가 높은것부터 출력

select decode(lower(telecom), 'skt','sk', lower(telecom)) as 통신사, count(*) 
from emp14 
group by decode(lower(telecom), 'skt','sk', lower(telecom)) 
order by 2 desc;

문제 : 이름의 성씨를 출력하고, 성씨별 인원수 출력, 성씨별 인원수가 높은것부터 출력

select substr(ename, 1, 1)as 성씨 , count(*) 
from emp14 
group by substr(ename, 1, 1)
order by count(*) desc;

문제 : 우리반 이메일 도메인을 출력하고, 이메일의 도메인별 인원수를 출력하시오

select rtrim(
              substr(rtrim (
                             rtrim (lower(email), 'com'),
                                                          'net'),
                                                                  instr(lower(email),
                                                                                      '@')+1),
                                                                                                '.') 
,count (*) 
from emp14
group by rtrim(
              substr(rtrim (
                             rtrim (lower(email), 'com'),
                                                          'net'),
                                                                  instr(lower(email),
                                                                                      '@')+1),
                                                                                                '.') 
order by 2 desc;

(1)com 을 rtrim 으로 자르고 , 다음 net 을 자르고

(2) substr 그 잘린 문자들에서부터,

이메일의 @ 다음문자(+1)의 순서부터(단순 숫자가 아닌 이유는 다들 email 의 형태(길이 ) 가 다르기때문 ) '.' 의  전 (-1) 까지 추출한다는 의미이다.