4. 복수행 함수


  • 한꺼번에 여러 건의 데이터가 함수로 입력
  • null값의 포함여부가 중요하다
    • 기본은 null값을 제외한 결과 도출
    • 인자로 *입력 시 null값 포함

1. 기본함수

  • count
    • 입력되는 데이터의 총 개수 리턴
    • count(컬럼명) : 컬럼의 null 미포함 데이터수 리턴
    • count(*) : 컬럼의 null 포함 데이터수 리턴
  • sum
    • 입력된 데이터의 합계 값 리턴
    • null값 미포함
    • 문자, 날짜 연산 불가
  • avg
    • 입력된 데이터의 평균 리턴
    • 문자, 날짜 연산 불가
    • 기본적으로 null데이터 미포함
      • 16으로 나누어야 하는데 null 미포함으로 10으로 나누는 경우가 생김
      • nvl 이용
      • 0 입력으로 null 수 포함
  • max/min
    • 최대값, 최소값 리턴
    • 문자, 날짜 연산 가능
  • stddev : 표준편차 리턴
  • variance : 분산 리턴
--avg 확인
select count(bonus),count(*), sum(bonus), avg(bonus), avg(nvl(bonus,0)) from professor;


COUNT(BONUS)   COUNT(*) SUM(BONUS) AVG(BONUS) AVG(NVL(BONUS,0))
------------ ---------- ---------- ---------- -----------------
          11         18        810 73.6363636                45

2. GROUP BY

  • 테이블 전체가 아닌, 특정 범위에서 데이터 집계
select deptno, avg(nvl(pay,0)) from professor group by deptno;

    DEPTNO AVG(NVL(PAY,0))
---------- ---------------
       203             500
       101             400
       103      383.333333
       202             285
       301          258.75
       201             450
       102      363.333333

3. HAVING

  • group by절에 의한 결과에 대해 조건을 정의
  • group by절의 결과를 제한하기 위해 사용
  • where절은 그룹함수를 비교조건으로 쓸 수 없다
    • 때문에 having 절 사용
-- 직업별 합계
select job, sum(sal) from emp group by job;

JOB         SUM(SAL)
--------- ----------
CLERK           4150
SALESMAN        5600
ANALYST         6000
MANAGER         8275
PRESIDENT       5000


-- 직업별 합계 중 5000 이상만, having 이용
select job, sum(sal) from emp group by job having sum(sal) >= 5000;

JOB         SUM(SAL)
--------- ----------
SALESMAN        5600
ANALYST         6000
MANAGER         8275
PRESIDENT       5000


-- 입사일 조건 이전 사원 중 직업별 합계, 그중 5000 이상
select job, sum(sal) from emp  where hiredate < '1982-01-01' group by job having sum(sal)>=5000  order by job  ;

JOB         SUM(SAL)
--------- ----------
MANAGER         8275
PRESIDENT       5000
SALESMAN        5600

select 문 작성(실행) 순서

    1. select
    1. from
    1. where
    1. group by
    1. having
    1. order by
  • group by에서는 별칭을 못쓰고 order by에서는 별칭을 쓸 수 있는 이유

4. ROLLUP

  • 주어진 데이터들의 소계를 리턴
  • group by 절에 주어진 조건으로 연산
  • group by rollup(a, b)
    • a별 모든 b의 소계
  • n개의 컬럼 입력 시
    • rollup : n+1 종류의 소계
    • cube : 2^n 종류의 소계
  • rollup(a,b,c,d)
select deptno, position, count(*), sum(pay) from professor group by rollup(deptno, position);

    DEPTNO POSITION                         COUNT(*)   SUM(PAY)
---------- ------------------------------ ---------- ----------
       101 전임강사                                1        270
       101 정교수                                  1        550
       101 조교수                                  1        380
       101                                         3       1200
       
       102 전임강사                                1        250
       102 정교수                                  1        490
       102 조교수                                  1        350
       102                                         3       1090
       
       103 전임강사                                1        290
       103 정교수                                  1        530
       103 조교수                                  1        330
       103                                         3       1150
       
       201 정교수                                  1        570
       201 조교수                                  1        330
       201                                         2        900
       
       202 전임강사                                1        260
       202 조교수                                  1        310
       202                                         2        570
       
       203 정교수                                  1        500
       203                                         1        500
       
       301 전임강사                                2        450
       301 조교수                                  2        585
       301                                         4       1035
                                                  18       6445

  • group by a,b,c
  • a,b,c
  • rollup 추가
  • a,b
  • a
  • 전체

5. cube

  • group by 항목들간 다차원적인 소계 계산
  • 모든 경우의 수에 대한 소계 산출
  • a,b,c 컬럼 입력 시
    • 8가지 조합의 소계
  • n개의 컬럼 입력 시
    • rollup : n+1 종류의 소계
    • cube : 2^n 종류의 소계
select deptno, position, count(*), sum(pay) from professor group by cube(deptno, position) order by deptno;

    DEPTNO POSITION                         COUNT(*)   SUM(PAY)
---------- ------------------------------ ---------- ----------
       101 전임강사                                1        270
       101 정교수                                  1        550
       101 조교수                                  1        380
       101                                         3       1200
       
       102 전임강사                                1        250
       102 정교수                                  1        490
       102 조교수                                  1        350
       102                                         3       1090
       
       103 전임강사                                1        290
       103 정교수                                  1        530
       103 조교수                                  1        330
       103                                         3       1150
       
       201 정교수                                  1        570
       201 조교수                                  1        330
       201                                         2        900
       
       202 전임강사                                1        260
       202 조교수                                  1        310
       202                                         2        570
       
       203 정교수                                  1        500
       203                                         1        500
       
       301 전임강사                                2        450
       301 조교수                                  2        585
       301                                         4       1035
       
           전임강사                                6       1520
           정교수                                  5       2640
           조교수                                  7       2285
                                                  18       6445
  • group by a,b,c
  • a,b,c
  • cube 추가
  • a,b
  • a,c
  • b,c
  • a
  • b
  • c
  • 전체

6. GROUPING

  • 소계에 대한 요약정보를 줄 때 사용
  • 해당컬럼이 그루핑 작업에 사용되었으면 0, 사용되지 않았으면 1을 리턴
  • rollup이나 cube에 의해 소계가 계산된 결과
    • grouping(expr) = 1
select deptno, avg(nvl(pay,0)), grouping(deptno)
from professor
group by rollup(deptno)
order by deptno;

    DEPTNO AVG(NVL(PAY,0)) GROUPING(DEPTNO)
---------- --------------- ----------------
       101             400                0
       102      363.333333                0
       103      383.333333                0
       201             450                0
       202             285                0
       203             500                0
       301          258.75                0
                358.055556                1
  • decode와 이용
    • 소계를 나타내는 필드에 원하는 문자열 지정
  • group by 컬럼이 1개인 경우
select decode(grouping(deptno),1,'합계',deptno) 학과,
round(avg(nvl(pay,0))) 평균급여, grouping(deptno)
from professor
group by rollup(deptno)
order by deptno;

학과                                             평균급여 GROUPING(DEPTNO)
---------------------------------------- ---------- ----------------
101                                             400                0
102                                             363                0
103                                             383                0
201                                             450                0
202                                             285                0
203                                             500                0
301                                             259                0
합계                                            358                1
  • group by 컬럼이 2개일 경우
select 
  decode(grouping(deptno),1,'[전체]',deptno) 학과,
  decode(grouping(position),1,decode(grouping(deptno),1,'[소계]','[학과별 소계]'),position) 학과,
  round(avg(nvl(pay,0))) 평균급여, grouping(deptno), grouping(position)
from professor
group by rollup(deptno, position)
order by deptno, position;

학과                                       학과                                   평균급여
---------------------------------------- ------------------------------ ----------
103                                      [학과별 소계]                         383
201                                      정교수                                570
201                                      조교수                                330
201                                      [학과별 소계]                         450
202                                      전임강사                              260
202                                      조교수                                310
202                                      [학과별 소계]                         285
203                                      정교수                                500
203                                      [학과별 소계]                         500
301                                      전임강사                              225
301                                      조교수                                293
301                                      [학과별 소계]                         259
[전체]                                   [소계]                                358
select
  decode(grouping(deptno),1,decode(grouping(position),1,'[전체]','[직급별 소계]'),deptno) 학과, 
  decode(grouping(position),1,decode(grouping(deptno),1,'[소계]','[학과별 소계]'),position) 직급,
  round(avg(nvl(pay,0))),
  grouping(deptno), grouping(position)
from professor
group by cube(deptno, position)
order by deptno, position;


학과                                       직급                             ROUND(AVG(NVL(PAY,0)))
---------------------------------------- ------------------------------ ----------------------
101                                      전임강사                                          270
101                                      정교수                                            550
101                                      조교수                                            380
101                                      [학과별 소계]                                     400
102                                      전임강사                                          250
102                                      정교수                                            490
102                                      조교수                                            350
102                                      [학과별 소계]                                     363

[직급별 소계]                            전임강사                                          253
[직급별 소계]                            정교수                                            528
[직급별 소계]                            조교수                                            326
[전체]                                   [소계]                                            358

7. GROUPING SETS

  • 그루핑 조건이 여러 개일 경우 유용
  • 학년별 인원수 합계, 학과별 인원수 합계를 구해야 하는 경우
    • 기존에는 별도로 구한 후 union으로 연산
    • grouping sets 이용 시 cube를 사용한 집계에서 원하는 집계만 수행 가능
  • 기존
select grade, count(*) from student group by grade
union
select deptno1, count(*) from student group by deptno1;

     GRADE   COUNT(*)
---------- ----------
         1          6
         2          5
         3          5
         4          5
       101          4
       102          4
       103          2
       201          6
       202          2
       301          2
  • grouping sets 이용
select grade, deptno1, count(*) from student
group by grouping sets(grade, deptno1)
order by grade, deptno1;

     GRADE    DEPTNO1   COUNT(*)
---------- ---------- ----------
         1                     6
         2                     5
         3                     5
         4                     5
                  101          4
                  102          4
                  103          2
                  201          6
                  202          2
                  301          2
  • 컬럼이 3개 이상인 경우 원하는 형태로 괄호로 묶을 수 있다
select city, department_name, job_id, avg(nvl(salary,0)) 
from emp_details_view 
group by grouping sets( (city, department_name), (city, job_id),(department_name, job_id))
order by city, department_name, job_id;

CITY                           DEPARTMENT_NAME                JOB_ID     AVG(NVL(SALARY,0))
------------------------------ ------------------------------ ---------- ------------------
London                         Human Resources                                         6500
London                                                        HR_REP                   6500
Munich                         Public Relations                                       10000
Munich                                                        PR_REP                  10000
Oxford                         Sales                                             8955.88235
Oxford                                                        SA_MAN                  12200
Oxford                                                        SA_REP             8396.55172
Seattle                        Accounting                                             10154
Seattle                        Administration                                          4400
Seattle                        Executive                                         19333.3333
Seattle                        Finance                                           8601.33333

CITY                           DEPARTMENT_NAME                JOB_ID     AVG(NVL(SALARY,0))
------------------------------ ------------------------------ ---------- ------------------
Seattle                        Purchasing                                              4150
Seattle                                                       AC_ACCOUNT               8300
Seattle                                                       AC_MGR                  12008
Seattle                                                       AD_ASST                  4400
Seattle                                                       AD_PRES                 24000
Seattle                                                       AD_VP                   17000
Seattle                                                       FI_ACCOUNT               7920
Seattle                                                       FI_MGR                  12008
Seattle                                                       PU_CLERK                 2780
Seattle                                                       PU_MAN                  11000
South San Francisco            Shipping                                          3475.55556

CITY                           DEPARTMENT_NAME                JOB_ID     AVG(NVL(SALARY,0))
------------------------------ ------------------------------ ---------- ------------------
South San Francisco                                           SH_CLERK                 3215
South San Francisco                                           ST_CLERK                 2785
South San Francisco                                           ST_MAN                   7280
Southlake                      IT                                                      5760
Southlake                                                     IT_PROG                  5760
Toronto                        Marketing                                               9500
Toronto                                                       MK_MAN                  13000
Toronto                                                       MK_REP                   6000
                               Accounting                     AC_ACCOUNT               8300
                               Accounting                     AC_MGR                  12008
                               Administration                 AD_ASST                  4400

CITY                           DEPARTMENT_NAME                JOB_ID     AVG(NVL(SALARY,0))
------------------------------ ------------------------------ ---------- ------------------
                               Executive                      AD_PRES                 24000
                               Executive                      AD_VP                   17000
                               Finance                        FI_ACCOUNT               7920
                               Finance                        FI_MGR                  12008
                               Human Resources                HR_REP                   6500
                               IT                             IT_PROG                  5760
                               Marketing                      MK_MAN                  13000
                               Marketing                      MK_REP                   6000
                               Public Relations               PR_REP                  10000
                               Purchasing                     PU_CLERK                 2780
                               Purchasing                     PU_MAN                  11000

CITY                           DEPARTMENT_NAME                JOB_ID     AVG(NVL(SALARY,0))
------------------------------ ------------------------------ ---------- ------------------
                               Sales                          SA_MAN                  12200
                               Sales                          SA_REP             8396.55172
                               Shipping                       SH_CLERK                 3215
                               Shipping                       ST_CLERK                 2785
                               Shipping                       ST_MAN                   7280