그룹함수

문법)

 SELECT   column, group_function(column)

 FROM     table

 [WHERE  condition]

 [GROUP BY  group_by_expression]

 [HAVING  group_condition]


종류 

의미 

COUNT 

행의갯수출력 

MAX 

NULL을제외한모든행에서최대값출력 

MIN 

NULL을제외한모든행에서최소값출력 

SUM 

NULL을제외한모든행의합계 

AVG 

NULL을제외한모든행의평균값 

STDDEV 

NULL을제외한모든행의표준편차 

VARIANCE 

NULL을제외한모든행의분산값 

GROUPING 

해당칼럼이그룹에사용되었는지여부를1또는0으로반환 

GROUPINGSET 

한번의질의로여러개의그룹화가능 



COUNT 함수

테이블에서 조건을 만족하는 행의 개수를 반환하는 함수

문법) COUNT ( {* |[ DISTINCT | ALL] expr} )


※ 참고 : COUNT(컬럼이름) 쓰면 널값 제외(컬럼에 값이 있는사람만 뽑아라)

          COUNT(*) 쓰면 널값포힘(컬럼의 모든 데이터 다 뽑아라)


예제 : 101번 학과 교수중에서 보직 수당을 받는 교수를 출력하여라.

SQL> SELECT COUNT(COMM)

     FROM professor

     WHERE deptno = 101;

출력결과

COUNT(*)

--------

 2

SQL> SELECT COUNT(*)

     FROM   professor

     WHERE deptno = 101 AND comm IS NOT NULL;

 

SQL> SELECT COUNT(*)

     FROM professor

     WHERE  deptno = 101;

출력결과)

COUNT(*)

--------

 4


예제 : 101번 학과 학생들의 몸무게 평균과 합계를 출력하여라.

SQL> SELECT AVG(weight), SUM(weight)

     FROM  student

     WHERE  deptno = 101;



예제 : 101번 학과 학생들 중에서 최대 키와 최소 키를 출력하여라.

SQL> SELECT MAX(height), MIN(height)

     FROM student

     WHERE deptno = 101;



예제 : 교수테이블에서 급여의 표준 편차와 분산을 구하여라.

SQL> SELECT STDDEV(sal), VARIANCE(sal)

     FROM  professor;



GROUP BY

사용 규칙)

  * 그룹핑 전에 WHERE절을 사용하여 그룹 대상 집합을 먼저 선택가능.

  * GROUP BY 절에는 반드시 칼럼이름이 포함되어야 하며 별명 사용 불가.

  * 그룹별로 출력 순서는 오름차순으로 정렬됨.(10g 부터는 적용 안됨)

  * SELECT 절에서 나열된 칼럼 이름이나 표현식은 GROUP BY절에 반드시 포함 되어야 함.

  * GROUP BY 절에 나열된 칼럼 이름은 SELECT 절에 명시하지 않아도 됨.



예제 : 에러남

SQL> SELECT deptno, position, AVG(sal)

     FROM  professor

     GROUP BY deptno;


※ 에러이유 : SELECT 절에 명시된 position 칼럼이 GROUP BY절에 명시되지 않음.

출력결과)

SELECT deptno, position, AVG(sal)

                        *

1행에 오류:

ORA-00979: GROUP BY의 식이 없습니다.



예제 : 교수 테이블에서 학과별로 교수 수와 보직 수당을 받는 교수 수를 출력하여라.

SQL> SELECT deptno, COUNT(*), COUNT(comm)

     FROM professor

     GROUP BY deptno;


예제 : 학과별로 소속 교수들의 평균 급여, 최소 급여, 최대 급여를 출력하여라.

SQL> SELECT deptno, AVG(sal), MIN(sal), MAX(sal)

     FROM professor

     GROUP BY deptno;

다중 칼럼을 이용한 그룹별 검색

예제 : 학생 테이블에서 전체 학생을 소속 학과별로 나누고, 같은 학과 학생은

       다시 학년별로 그룹핑하여, 학과와 학년별로 인원수, 평균 몸무게를

       출력하여라. 단, 평균 몸무게는 소수점 이하 첫번째 자리에서 반올림한다

SQL> SELECT deptno, grade, COUNT(*), ROUND(AVG(weight))

     FROM  student

     GROUP BY deptno, grade;



1) ROLLUP : GROUP BY 절의 그룹 조건에 따라 전체 행을 그룹화하고 각 그룹에 대해 부분합을 구하는 연산자

2) CUBE : ROLLUP에 의한 그룹 결과와 GROUP BY 절에 기술된 조건에 따라 그룹 조합을 만드는 연산자


   GROUP BY 절에 기술된 칼럼 수가 n개인 경우,

   ROLLUP 연산자의 그룹핑 조합 : n+1

   CUBE 연산자의 그룹핑 조합 : 2n


문법)

SELECT     column, group_function(column)

FROM        table

[WHERE    condition]

[GROUP BY  [ROLLUP|CUBE]  group_by_expression]

[HAVING    group_condition]



ROLLUP 사용

예제 : 소속 학과별로 교수 급여 합계와 모든 학과 교수들의 급여 합계를 출력하여라.

SQL> SELECT deptno, SUM(sal)

     FROM  professor

     GROUP BY ROLLUP(deptno);


SQL> select deptno, position,

               count(*),sum(sal)

     from professor

     group by rollup(deptno,position);


    DEPTNO POSITION                                   COUNT(*)   SUM(SAL)

---------- ---------------------------------------- ---------- ----------

       101 교수                                              1        500

       101 부교수                                            1        420

       101 조교수                                            1        360

       101 전임강사                                          1        210

       101                                                   4       1490

       102 교수                                              1        450

       102 전임강사                                          1        240

       102                                                   2        690

       201 조교수                                            1        320

       201                                                   1        320

      ...............

13 rows selected.

CUBE 연산자

예제 : CUBE 연산자를 이용하여 학과 및 직급별 교수 수, 학과별 교수 수, 직급별 교수 수, 전체 교수 수를 출력하여라.

SQL> SELECT deptno, position, COUNT(*)

     FROM  professor

     GROUP BY CUBE(deptno, position);


SQL> select deptno,position,

               count(*), sum(sal)

     from professor

     group by cube(deptno,position);


    DEPTNO POSITION                                   COUNT(*)   SUM(SAL)

---------- ---------------------------------------- ---------- ----------

                                                             8       2900

           교수                                              2        950

           부교수                                            2        820

           조교수                                            2        680

           전임강사                                          2        450

       101                                                   4       1490

       101 교수                                              1        500

       101 부교수                                            1        420

       101 조교수                                            1        360

       101 전임강사                                          1        210

       102                                                   2        690

       102 교수                                              1        450

       102 전임강사                                          1        240

       201                                                   1        320

       201 조교수                                            1        320

       202                                                   1        400

       202 부교수                                            1        400


17 rows selected.





HAVING

그룹함수를 조건으로 주고싶은 경우 where절을 쓸수없음 → HAVING


문법)

 SELECT            column, group_function(column)

 FROM               table

 [WHERE           condition]

 [GROUP BY      group_by_expression]

 [HAVING           group_condition]

 [ORDER BY       column]


예제 : 학생 수가 4명 이상인 학년에 대해서 학년, 학생 수, 평균 키, 평균 몸무게를 출력하여라. 단, 평균 키와 평균 몸무게는 소수점 첫 번째 자리에서 반올림하고, 출력순서는 평균 키가 높은 순부터 내림차순으로 출력하여라.


* HAVING 절을 사용하지 않은 경우 : 학생수가 4명 이하여도 출력된다

SQL> SELECT grade, count(*), ROUND(AVG(height)) avg_height, ROUND(AVG(weight)) avg_weight

     FROM   student

     GROUP BY grade

     ORDER BY avg_height DESC;


출력결과)

        GRADE          COUNT(*)          AVG_HEIGHT          AVG_WEIGHT

       -------         --------          -----------         ----------

         4                 3                 176                  85

         1                 6                 175                  65

         3                 2                 171                  79

         2                 5                 165                  53



* HAVING 절을 사용한 경우 : 학생수가 4명 이상만 출력된다

SQL> SELECT grade, count(*), ROUND(AVG(height)) avg_height, ROUND(AVG(weight)) avg_weight

     FROM   student

     GROUP BY grade

     HAVING  COUNT(*) > 4

     ORDER BY avg_height DESC;


출력결과)

       GRADE            COUNT(*)         AVG_HEIGHT           AVG_WEIGHT

       -------          --------        -----------            ----------

         1                 6                  175                  65

         2                 5                  165                  53







연습문제


1. 학과별로 평균 몸무게와 학생수를 출력하되 평균 몸무게의 내림차순으로 정렬하세요.

****************************

SQL> select deptno, avg(weight), count(*)

     from student

     group by deptno

     order by avg(weight) desc;


    DEPTNO AVG(WEIGHT)   COUNT(*)

---------- ----------- ----------

       102        69.5          4

       101          68          8

       201       61.75          4

****************************



2. 동일 학과 내에서 같은 학년에 재학중인 학생 수가 3명 이상인 그룹의 학과번호,

   학년, 학생 수, 최대 키, 최대 몸무게를 출력하세요.

****************************

SQL> select deptno, grade, count(*), max(height), max(weight)

     from student

     group by deptno, grade

     having count(grade)>=3;


    DEPTNO GR   COUNT(*) MAX(HEIGHT) MAX(WEIGHT)

---------- -- ---------- ----------- -----------

       201 1           3         184          70

       101 2           3         171          72

****************************



3. 학과와 학년 별 키의 평균, 학과별 키의 평균, 전체 학생에 대한 키의 평균을 구하세요.

*********************************

SQL> select deptno,grade, avg(height)

     from student

     group by cube(deptno,grade);


    DEPTNO GR AVG(HEIGHT)

---------- -- -----------

                 171.5625

           1   175.333333

           2        164.8

           3        170.5

           4          176

       101        171.125

       101 1          177

       101 2   164.666667

       101 3          170

       101 4        175.5

       102            168

       102 1          160

       102 2          164

       102 3          171

       102 4          177

       201            176

       201 1   179.333333

       201 2          166


18 rows selected.

*********************************


학과와 학년 별 키의 평균

SQL> select deptno, grade,

     avg(height)

     from student

     group by rollup(deptno,grade);


    DEPTNO GR AVG(HEIGHT)

---------- -- -----------

       101 1          177

       101 2   164.666667

       101 3          170

       101 4        175.5

       101        171.125

       102 1          160

       102 2          164

       102 3          171

       102 4          177

       102            168

       201 1   179.333333

       201 2          166

       201            176

                 171.5625


14 rows selected.



학과별 키의 평균

SQL> select deptno, avg(height)

     from student

     group by rollup(deptno);


    DEPTNO AVG(HEIGHT)

---------- -----------

       101     171.125

       102         168

       201         176

              171.5625


4. 학과별 평균 몸무게와 학년 별 평균 몸무게를 구하세요.

***********************************************

SQL> select deptno, grade,

     avg(weight)

     from student

     group by cube(deptno,grade);


    DEPTNO GR AVG(WEIGHT)

---------- -- -----------

                  66.8125

           1   64.6666667

           2         53.4

           3           79

           4   85.3333333

       101             68

       101 1           62

       101 2           56

       101 3           88

       101 4           82

       102           69.5

       102 1           68

       102 2           48

       102 3           70

       102 4           92

       201          61.75

       201 1   65.3333333

       201 2           51


18 rows selected.

***********************************************

SQL> select deptno, grade,

     avg(weight)

     from student

     group by rollup(deptno,grade);


    DEPTNO GR AVG(WEIGHT)

---------- -- -----------

       101 1           62

       101 2           56

       101 3           88

       101 4           82

       101             68

       102 1           68

       102 2           48

       102 3           70

       102 4           92

       102           69.5

       201 1   65.3333333

       201 2           51

       201          61.75

                  66.8125


14 rows selected.


21p 연습문제============================================

교수 테이블


6. 학과별 교수 수가 2명 이하인 학과 번호, 교수 수를 출력 하세요.

********************************************************

SQL> select deptno, count(*)

     from professor

     group by deptno

     having count(*)<=2;


    DEPTNO   COUNT(*)

---------- ----------

       201          1

       102          2

       202          1

********************************************************



7. 교수 중에서 급여와 보직수당을 합친 금액이 가장 많은 경우와 가장 적은 경우 그리고 평균 금액을 출력하여라. 단, 보직수당이 없는 교수의 수당은 0으로 계산하고, 급여는 소수점 둘째 자리에서 반올림하세요.

**************************************************************************

SQL> select profno, max(round(sal,1)+NVL(comm,0)),

                        min(round(sal,1)+NVL(comm,0)), avg(round(sal,1)+NVL(comm,0))

     from professor

     group by profno;


    PROFNO MAX(ROUND(SAL,1)+NVL(COMM,0)) MIN(ROUND(SAL,1)+NVL(COMM,0)) AVG(ROUND(SAL,1)+NVL(COMM,0))

---------- ----------------------------- -------------------- -----------------------------

      9903                       375                       375                          375

      9906                       420                       420                           420

      9908                       417                       417                           417

      9902                       320                       320                           320

      9907                       210                       210                           210

      9901                       520                       520                           520

      9904                       240                       240                           240

      9905                       475                       475                           475


8 rows selected.

************************************************************************


SQL> select position, max(round(sal,1)+nvl(comm,0)),

                       min(round(sal,1)+nvl(comm,0)), avg(round(sal,1)+nvl(comm,0))

     from professor

     group by position

     having position='교수';



SQL> select max( sal+ nvl2(comm,comm,0) ) 최대,

     min(sal+ nvl2(comm,comm,0) ) 최소,

     round( avg(sal+ nvl2(comm,comm,0) ),1) 평균

     from professor;



SQL> select ROUND(max(sal+nvl(comm,0)),1) MAX,

            ROUND(min(sal+nvl(comm,0)),1) MIN,ROUND(avg(sal+nvl(comm,0)),1) AVG

     from professor

     group by position

     having position = '교수';







8. 교수 중에서 급여와 보직수당을 합친 금액이 가장 많은 경우와 가장 적은

   경우 그리고 평균 금액을 출력하여라. 단, 보직수당이 없는 교수의 급여는

    0으로 계산하고, 급여는 소수점 둘째 자리에서 반올림하세요.


****************************************************************************

SQL> select profno,

        max(round((sal+nvl2(comm,comm,-sal)),1)),

        min(round((sal+nvl2(comm,comm,-sal)),1)), avg(round((sal+nvl2(comm,comm,-sal)),1))

     from professor

     group by profno;



    PROFNO MAX(ROUND((SAL+NVL2(COMM,COMM,-SAL)),1)) MIN(ROUND((SAL+NVL2(COMM,COMM,-SAL)),1)) AVG(ROUND((SAL+NVL2(COMM,COMM,-SAL)),1))

---------- ------------------------- --------------------------- ---------------------------

      9903                        375                        375                          375

      9906                        0                          0                             0

      9908                        417                        417                          417

      9902                        0                          0                             0

      9907                        0                          0                             0

      9901                        520                        520                          520

      9904                        0                          0                             0

      9905                        475                        475                          475


8 rows selected.

****************************************************************************


※ nvl2로 comm이 null이 아니면 그대로 comm, null이면 -sal해서 sal값을 -로 만들어준다.

그런후 sal과 더하면 0이 된다. 이것이 sal+comm 값 이다.

round((sal+nvl2(comm,comm,-sal)),1)



SQL> select position, max(round(sal,1)+nvl2(comm,comm,-round(sal,1))) MAX,

                      min(round(sal,1)+nvl2(comm,comm,-round(sal,1))) MIN,

                      avg(round(sal,1)+nvl2(comm,comm,-round(sal,1))) AVG

     from professor

     group by position

     having position='교수';



SQL> select ROUND(max(sal+nvl2(comm,comm,-sal))) MAX,

            ROUND(min(sal+nvl2(comm,comm,-sal))) MIN,

            ROUND(avg(sal+nvl2(comm,comm,-sal))) AVG

     from professor

     group by position

     having position ='교수';




9. 학과와 직급별 급여 평균, 학과별 급여 평균, 직급별 급여 평균 그리고 교수

    전체에 대한 급여 평균을 출력하세요.

***********************************************************

SQL> select deptno,position, avg(sal)

     from professor

     group by cube(deptno,position);


    DEPTNO POSITION                                   AVG(SAL)

---------- ---------------------------------------- ----------

                                                         362.5

           교수                                            475

           부교수                                          410

           조교수                                          340

           전임강사                                        225

       101                                               372.5

       101 교수                                            500

       101 부교수                                          420

       101 조교수                                          360

       101 전임강사                                        210

       102                                                 345

       102 교수                                            450

       102 전임강사                                        240

       201                                                 320

       201 조교수                                          320

       202                                                 400

       202 부교수                                          400


17 rows selected.

************************************************************



10. 직급별로 평균 급여가 300보다 크면 ‘우수’, 작거나 같으면 ‘보통’을 출력

    하세요.


********************************************

SQL> select position,

            case when avg(sal)>300 then '우수'

                 when avg(sal)<=300 then '보통'

            end

     from professor

     group by position;


POSITION                                 CASEWHEN

---------------------------------------- --------

교수                                     우수

부교수                                   우수

조교수                                   우수

전임강사                                 보통

*******************************************


SQL> select position,avg(sal),

            case when avg(sal) >= 300 then '우수'

            else '보통'

            end as 급여등급

     from professor

     group by position;



22p 연습문제============================================

10. Emp 테이블의 hiredate 컬럼을 참고해서 아래의 결과처럼 출력해보세요.


   HAP       1980     1981     1982      1983        1987

----------  -------  -------  -----   --------    --------

   14          1       10       1          0          2


요약 : 입사일별로 숫자 카운트, 전체 합


*********************************************************************

SQL> select count(*) HAP,

     count(decode(to_char(hiredate,'YYYY'),'1980',0)) "1980",

     count(decode(to_char(hiredate,'YYYY'),'1981',0)) "1981",

     count(decode(to_char(hiredate,'YYYY'),'1982',0)) "1982",

     count(decode(to_char(hiredate,'YYYY'),'1983',0)) "1983",

     count(decode(to_char(hiredate,'YYYY'),'1987',0)) "1987"

     from emp;


       HAP       1980       1981       1982       1983       1987

---------- ---------- ---------- ---------- ---------- ----------

        14          1         10          1          0          2

**********************************************************************

SQL> select to_char(hiredate,'YYYY')

     from emp;


TO_CHAR(

--------

1980

1981

....

1987

1981

1981

1982


14 rows selected.




23p 연습문제============================================

문제 : Emp table을 사용하여  부서별로 직급별로 급여 합계를 구하고 합계를 구하세요. 아래 결과처럼 만드시면 됩니다


DEPTNO   CLERK         MANAGER   PRESIDENT    ANALYST   SALESMAN   합계

------- -------       --------- ----------    --------  --------- -----

  10       1300         2450        5000        0         0        8750

  20       1900         2975          0        6000       0       10875

  30       950          2850          0         0        5600      9400

           4150         8275        5000       6000      5600     29025


SQL> select deptno,

          sum( to_number( decode(job,'CLERK',sal,0) ) ) clerk,

           sum( to_number( decode(job,'MANAGER',sal,0) ) ) manager,

           sum( to_number( decode(job,'PRESIDENT',sal,0) ) ) president,

           sum( to_number( decode(job,'ANALYST',sal,0) ) ) analyst,

           sum( to_number( decode(job,'SALESMAN',sal,0) ) ) salesman,

           sum( sal ) sum

    from emp

    where job is not null
    group by rollup(deptno)

    order by 1;



SQL> select deptno,

          sum(decode(job,'CLERK',sal,0)) "CLERK",

          sum(decode(job,'MANAGER',sal,0)) "MANAGER",

          sum(decode(job,'PRESIDENT',sal,0)) "PRESIDENT",

          sum(decode(job,'ANALYST',sal,0)) "ANALYST",

          sum(decode(job,'SALESMAN',sal,0)) "SALESMAN",

          sum(sal) "합계"

     from emp

     group by rollup(deptno);

24p 연습문제============================================


무제 : Temp 테이블을 사용하여 아래와 같이 출력하시오.

        No 컬럼은 ceil 함수와 rownum 을 이용하여 3개씩 묶어 하나의 no를 부여하고

        Decode , max , mod 함수를 적절하게 활용하여 각 데이터의 rownum 을 3으로

        나눈 나머지를 0,1,2 일 경우로 나누어 컬럼의 위치를 지정하면 됩니다.


         NO    사번1      이름1        사번2       이름2     사번3     이름3

       -----  --------  --------      --------    ------    --------  ------

         1   19970101    김길동       19960101    홍길동    19970201   박문수

         2   19930331    정도령       19950303    이순신    19966102   지문덕

         3   19930402    강감찬       19960303    설까치    19970112   연흥부

         4   19960212    배뱅이       20000101    이태백    20000102   김설악

         5   20000203    최오대       20000334    박지리    20000305   정북악

         6   20006106    유도봉       20000407    윤주왕    20000308   강월악

         7   20000119    장금강       20000210    나한라


SQL> select ceil(rownum/3) "NO.",

            max(decode(mod(rownum,3),1,emp_id)) "사번1",

            max(decode(mod(rownum,3),1,emp_name)) "이름1",

            max(decode(mod(rownum,3),2,emp_id)) "사번2",

            max(decode(mod(rownum,3),2,emp_name)) "이름2",

            max(decode(mod(rownum,3),0,emp_id)) "사번3",

            max(decode(mod(rownum,3),0,emp_name)) "이름3"

     from temp

     group by ceil(rownum/3)

     order by 1;





윗 문제 풀때 참고..

select ceil(rownum/3) no,

    decode(mod(rownum,3), 1, emp_id) aa,

    decode(mod(rownum,3), 1, emp_name) bb,

    decode(mod(rownum,3), 2, emp_id) cc,

    decode(mod(rownum,3), 2, emp_name) dd,

    decode(mod(rownum,3), 0, emp_id) ee,

    decode(mod(rownum,3), 0, emp_name) ff

from temp

order by 1










--------------------------====------------========---------------------------

문제 : student table의 birthdate 칼럼을 이용하여 각 학생이 태어난 월을 찾아서 아래의 결과로각 월별로 몇명이 태어났는지 집계하여 출력하세요.


1월 2월 3월 4월 5월 ...... 12월 합계

--- --- --- --- ---        ---  ----

 명  명  명  명  명         명   명


**********************************************************************

SQL> select

        concat(count(decode(to_char(birthdate, 'MM'),'01',0)),'명') "1월",

        concat(count(decode(to_char(birthdate, 'MM'),'02',0)),'명') "2월",

        concat(count(decode(to_char(birthdate, 'MM'),'03',0)),'명') "3월",

        concat(count(decode(to_char(birthdate, 'MM'),'04',0)),'명') "4월",

        concat(count(decode(to_char(birthdate, 'MM'),'05',0)),'명') "5월",

        concat(count(decode(to_char(birthdate, 'MM'),'06',0)),'명') "6월",

        concat(count(decode(to_char(birthdate, 'MM'),'07',0)),'명') "7월",

        concat(count(decode(to_char(birthdate, 'MM'),'08',0)),'명') "8월",

        concat(count(decode(to_char(birthdate, 'MM'),'09',0)),'명') "9월",

        concat(count(decode(to_char(birthdate, 'MM'),'10',0)),'명') "10월",

        concat(count(decode(to_char(birthdate, 'MM'),'11',0)),'명') "11월",

        concat(count(decode(to_char(birthdate, 'MM'),'12',0)),'명') "12월",

        concat(count(*),'명') "합계"

     from student;

***********************************************************************


'명' 안나오는 답

SQL> select

        count(decode(to_char(birthdate, 'MM'),'01',0)) "1월",

        count(decode(to_char(birthdate, 'MM'),'02',0)) "2월",

        count(decode(to_char(birthdate, 'MM'),'03',0)) "3월",

        count(decode(to_char(birthdate, 'MM'),'04',0)) "4월",

        count(decode(to_char(birthdate, 'MM'),'05',0)) "5월",

        count(decode(to_char(birthdate, 'MM'),'06',0)) "6월",

        count(decode(to_char(birthdate, 'MM'),'07',0)) "7월",

        count(decode(to_char(birthdate, 'MM'),'08',0)) "8월",

        count(decode(to_char(birthdate, 'MM'),'09',0)) "9월",

        count(decode(to_char(birthdate, 'MM'),'10',0)) "10월",

        count(decode(to_char(birthdate, 'MM'),'11',0)) "11월",

        count(decode(to_char(birthdate, 'MM'),'12',0)) "12월",

        count(*) "합계"

      from student;



=========---------==========------------========-----------=

문제 : student table의 tel 칼럼을 사용하여

        각 학생들의 지역을 추출하여 지역별로

        아래와 같이 집계해서 출력하세요.

        (02:서울, 051:부산, 052:울산,053:대구,055:경남)


        서울  부산  울산  대구  경남

        ---   ---   ----  ----  ----

        2명   5명   1명   1명   7명


************************************************************************

SQL> select

        count(decode(substr(tel,1,instr(tel,')',1)-1),'02',1,''))||'명' 서울,

        count(decode(substr(tel,1,instr(tel,')',1)-1),'051',1,''))||'명' 부산,

        count(decode(substr(tel,1,instr(tel,')',1)-1),'052',1,''))||'명' 울산,

        count(decode(substr(tel,1,instr(tel,')',1)-1),'053',1,''))||'명' 대구,

        count(decode(substr(tel,1,instr(tel,')',1)-1),'055',1,''))||'명' 경남

     from student;


SQL> select

        concat(count(decode(to_char(rtrim(substr(tel,1,3),')')),'02',0)),'명') "서울",

        concat(count(decode(to_char(rtrim(substr(tel,1,3),')')),'051',0)),'명') "부산",

        concat(count(decode(to_char(rtrim(substr(tel,1,3),')')),'052',0)),'명') "울산",

        concat(count(decode(to_char(rtrim(substr(tel,1,3),')')),'053',0)),'명') "대구",

        concat(count(decode(to_char(rtrim(substr(tel,1,3),')')),'055',0)),'명') "경남"

     from student;

************************************************************************


서울    부산   울산    대구   경남

-----  -----  ------  -----  -----

 2명    5명     1명   1명      7명


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

SQL정리 7장 서브쿼리  (0) 2012.01.09
SQL정리 6장 join  (0) 2012.01.07
SQL정리 4장 함수  (0) 2012.01.04
SQL정리 1-3장  (0) 2012.01.04
SQL - SELECT 문  (0) 2012.01.02
Posted by 딩구르
,