본문 바로가기
oracle/[SQL] SQL

4장. 복수행 함수 (그룹함수)

by #moonyz 2014. 10. 1.
복수행 함수 (그룹함수)


[ GROUP 함수의 종류 ]

- 그룹함수 ( 컬럼명)

- 데이터가 있는 항목의 건수만 

- null 값은 안가져옴



1. COUNT 

- 데이터가 있는 항목의 건수를 반환

- count(*) : null값을 포함한 모든 데이터의 총 건수

- count(column_name) : null값을 제외한 데이터가 존재하는 행 건수



2. SUM 

입력된 데이터들의 합계값을 구하는 함수



3. AVG

- 입력된 값들의 평균값을 구해주는 함수

cf. median : 중간값

- avg(column_name) : null값을 제외한 데이터가 존재하는 건수의 평균값을 구한다.



4. MAX / MIN

- MAX : 주어진 데이터 중에서 가장 큰 값 (최대값)

- MIN : 주어진 데이터 중에서 가장 작은 값 (최소값)

* 시간 오래걸림 ( 정렬을 시키기 때문?)

* 최대값 / 최소값을 구할때는 인덱스 활용을 추천!



5. STDDEV / VARIANCE 

- STDDEV : 주어진 데이터들의 표준편차

- VARIANCE : 주어진 데이터들의 분산




[ 특정 조건으로 세부적인 그룹화 하기 (group by) ]

1. GROUP BY

- 10g R1까지는 자동정렬, R2부터는 order by로 정렬해줘야함

- alias 사용 안됨



* GROUP BY절과 정렬(SORT)과의 관계

- Oracle 10g R1 버전까지는 GROUP BY 결과는 늘 Sort 되어서 출력되었다.

- 그러나 10g R2 버전부터 Hash 기반의 New in-Memory Sort Algorithm 방식으로 변경되면서

   더 이상 정렬이 되지 않고 출력이 된다.

- 정렬이 되지 않기에 기존 방법보다 성능 향상이 많이 이루어 졌으나,

   정렬을 원하는 경우 반드시 ORDER BY절을 함께 사용해야만 한다.


- 만약 GROUP BY 후 자동으로 정렬되었던 이전 방식으로 돌아가고 싶다면,

   초기화 파라미터 파일 (pfile 이나 spfile)에 "_gby_hash_aggregation_enabled"=FALSE로 설정

- 그러나 전체적인 성능이 저하되므로 비추!



2. HAVING

- 그룹함수를 비교조건으로 사용할때 



3. ROLLUP(컬럼명) 

- 주어진 데이터들의 소계, 주어진 데이터들의 전체 총계를 구해줌

- 컬럼 하나씩 rollup해도 상관없음


* 각각 하나의 컬럼만 rollup한 화면

  



* rollup 더 확실히 알기

      




4. CUBE 

- 각 소계도 출력, 전체 총계까지 출력(요약) 

- 속도 느리지만, good



5. GROUPING SETS 

- 그룹핑 조건이 여러개일 경우

- EX) student 테이블에서 학년별 인원수와 합계, 학과별 인원수와 합계를 구할때





6. LISTAGG 

- 11g에서 추가됨

- 데이터들을 가로로 나열

- listagg(column_name) within group( "이곳에 아무조건도 주지 않으면 에러발생" )



7. PIVOT / UNPIVOT

- 11g에서 추가됨

- PIVOT : row 단위를 column 단위로 변경

- UNPIVOT : column 단위를 row 단위로 변경

- PIVOT 기능을 사용하지 않고 DECODE 함수를 활용하는 방법 -> 숙지필수


* PIVOT 을 사용하지 않고 DECODE 활용하는법


 - decode를 이용해서 달력출력하기


 - decode 이용해서 count 하기




8. LAG 

- 이전 행 값을 가져올 때 사용하는 함수(한자리씩 미룰때)



9. LEAD 

- LAG와 반대 (한자리씩 땡길때)



10. RANK 

- 주어진 컬럼 값의 그룹에서 값의 순위 출력

  



[집계용 문법]

- RANK (조건값) WITHIN GROUP (order by 조건값 컬럼명) 




[분석용 문법]

- RANK ( ) OVER (order by 컬럼명 [ASC|DESC])

- RANK ( ) OVER (partition by 컬럼명) : partition by 컬럼명 내에서 순위 출력




11. SUM ( ) OVER ( order by 컬럼명) 

- 누계(누적값)

- SUM ( ) OVER (order by 컬럼명)




- RANK ( ) OVER (partition by 컬럼명) : partition by 컬럼명 내에서 누적값 출력



12. RATIO_TO_REPORT 

- 비율구하는 함수 

RATIO_TO_REPORT( 컬럼명 ) OVER( ) 

RATIO_TO_REPORT( 컬럼명 ) OVER(partition by 컬럼명)

- ROUND와 함께 사용

ROUND((RATIO_TO_REPORT( 컬럼명 ) OVER( ))*100, 2)




'oracle > [SQL] SQL' 카테고리의 다른 글

6장. DDL  (0) 2014.10.02
5장. JOIN  (0) 2014.10.02
3장. 정규식함수  (0) 2014.09.30
2장. 단일행 함수  (0) 2014.09.29
1장. SELECT  (0) 2014.09.29

댓글