Database SQL/Oracle

[DB#20] 그룹설정+예제

양동민 2020. 11. 30. 14:43

회원번호, 이름, A항목점수, B항목점수, 성별, 가입일자가 있는 테이블 PERSON이 있다.

그룹을 나눌때는 기준이 필요하다. 그룹을 묶을때, 성별, 연도, 점수 등 여러가지 기준으로 나눌 수 있다.

 

SELECT * FROM PERSON;

 

성별로 조회하는 방법은 다음과 같다.

SELECT GENDER FROM PERSON; 

이렇게 하면 1.남자, 2.남자, 3.여자, 4.남자, 5.여자 와 같은 방식으로 쭉 나온다.(회원 번호와 성별이 표시됨)

다른 방법으로는 

SELECT DISTINCT GENDER FROM PERSON; -> 중복제거

SELECT GENDER FROM PERSON GROUP BY GENDER;

이렇게 하면 각종 항목을 추가할 수 있고, 여자와 남자라는 GENDER로만 출력된다.

그렇다면 여기서 항목추가로 몇명인지 집계함수를 추가할 수 있다.

SELECT GENDER, COUNT(*) FROM PERSON GROUP BY GENDER; 

이 식은 COUNT(*) 집계함수를 사용하여 개수를 셀 수있다. 즉 지금상황에선 남자가 몇명인지 여자가 몇명인지

성별을 기준으로 개수를 셀 수 있다는 것이다.

 

또한 성별기준으로 최고점수를 출력하고 싶을때는,

SELECT GENDER, COUNT(*), MAX(ASCORE) FORM PERSON GROUP BY GENDER;

라고 하면 남자 A항목 최고점수, 여자 A항목 최고점수를 출력할 수 있다.

 

평균을 구하고 싶다면,

SELECT GENDER, AVG(ASCORE), AVG(BSCORE) FROM PERSON GROUP BY GENDER; 

라고 하면 평균점수가 나오게 된다.

 

GENDER가 아닌 다른쪽으로 기준을 잡고싶다면, 예를들어 연도별로 등록한 회원들의 인원수를 구하여 출력한다면

SELECT

EXTRACT(YEAR FROM REGIST_DATE), COUNT(*) -> 연도별 + 개수 함수(3)

FROM PERSON -> PERSON 테이블에서(1)

GROUP BY EXTRACT(YEAR FROM REGIST_DATE); -> 연도로 그룹나누기(2)

ORDER BY EXTRACT(YEAR FROM REGIST_DATE) ASC; -> 연도 정렬해주기.(4)

(1)-(2)-(3)-(4) 순으로 작동된다.

 

SELECT 연도, COUNT(*) FROM (      -> (4)

SELECT PERSON.*, EXTRACT(YEAR FROM REGIST_DATE) 연도 FROM PERSON  -> 연도로 정렬조회. (1)

GROUP BY 연도      -> (2)

ORDER BY 연도;      -> (3)

라고 나타낼 수도 있다. (1)~(4) 순으로 진행되는데, (1)에서 별칭을 사용하였기에 (2), (3) 에서도 사용할 수 있는것이다.

별칭은 조회할때만 새로 만들 수 있다.

 

이에 따라 알 수있듯, 이와같이 그룹조회는 집계합수를 이용하여 그룹별로 집계한 값을 확인하는 것이 목표이다.

 

예제 ) 

성씨별로 인원수, 성씨별 전체평균 조회 후 가나다 순 정렬 후 출력

SELECT

SUBSTR(PERSON_NAME, 1, 1) || '씨', COUNT(*),

AVG((ASCORE+BSCORE)/2)

FROM PERSON

GROUP BY SUBSTR(PERSON_NAME, 1, 1)

ORDER BY SUBSTR(PERSON_NAME, 1, 1) ASC;

 

 

예제 ) 

성시별로 인원수와 

'Database SQL > Oracle' 카테고리의 다른 글

[DB#21]  (0) 2020.11.30
[DB#19] 함수 및 서브쿼리 점검 문제  (0) 2020.11.26
[DB#18] 오라클 함수  (0) 2020.11.26
[DB#17] 정렬(SELECT) 데이터를 정렬해보자!(ASC, DESC)  (0) 2020.11.26
[DB#16] 조회(SELECT)  (0) 2020.11.25