본문 바로가기

sql

6. 그룹함수

728x90
반응형

그룹함수

여러개의 행의 데이터가 입력이 되어서

하나의 값으로 출력되는 함수

 

 

*그룹수의 종류

 

1. max (최대값)

2. min (최소값)

3. avg (평균값)

4. count (개수값)

5. sum (토탈값)

6. stddev (표준편차)

7. variance (분산)

 

 

 

max 함수

 "최대값을 출력하는 함수"

:

사원 테이블에서 최대월급을 출력하시오!

select max(sal) from emp;

 

사원테이블 정리하고 싶어하심

delete from emp

 where job is null;

commit;

 

 

 

문제101. 직업이 SALESMAN 사원들 중에서의

최대월급을 출력하시오

select max(sal)

from emp

where job = 'SALESMAN';

 

*실행순서: FROM- WEHRE- SELECT*

 

 

문제102. 통계학과인 학생들 중에서

가장 나이가 많은 학생의 나이를 출력하시오

SELECT MAX(AGE)

from emp2

where major like '%통계%';

 

*이름까지 알고 싶으나

ename 넣으면 안나옴.

배워야 된다하심

 

 

문제103. 부서번호가 20번인 사원들 중에서

최대월급을 출력하시오

select max(sal)

from emp

where deptno = '20';

 

 

 

화면 캡처: 2018-10-17 오후 3:22

 

부서번호도 알고싶은데 넣으면

에러난다.

왜냐하면

실행순서가 from-where-select

그래서 where 절의 부서번호 20번인 대상이 5명이라서

마지막 select 절에서 에러뜨는거임

 

해결방법은

select deptno, max(sal)

from emp

where deptno = '20'

group by deptno;

뜻은

중복되는 부서번호 20

하나로 모아서 그룹화 .

 

실행순서는

from-where-group by-select

 

group by 절의 역할? 그룹핑을 하는 역할을

                                 수행한다.

 

만약에

select deptno, max(sal)

  from emp

  group by deptno;

하면

중복되는 부서번호끼리 그룹핑한다

10번은 10번끼리

20번은 20번끼리

.

.

.

그렇게 그룹핑 부서번호

최대연봉을 보여준다.

 

 

 

화면 캡처: 2018-10-17 오후 3:30

 

 

 

문제 104. 통신사, 통신사별 최대나이를 출력하시오

 

select lower(telecom), max(age)

from emp2

group by  lower(telecom);

 

****group by 절에서는 별칭지칭이 안되넹.

lower 라는 단일행함수로 그룹화해도 되넹

신기방기....

 

문제 105. 전공, 전공별 최대나이를 출력하시오

select major, max(age)

from emp2

group by major;

 

 

문제 106. 위의 결과를 다시 출력하는데

전공을 가나다라 순으로

출력하시오

 

select major, max(age)

from emp2

group by major

order by major asc;

 

 

문제 107. 위의 결과를 다시 출력하는데

통계학과는

제외하고 출력하시오

 

select major, max(age)

from emp2

where major not like '%통계%'

group by major

order by major asc;

 

 

 

min 함수

문제108. 직업, 직업별 최소월급을 출력하시오

select job, min(sal)

from emp

group by job;

 

 

문제 109. 위의 결과를 다시 출력하는데

최소월급이 높은것부터 출력하시오

select job, min(sal)

from emp

group by job

order by min(sal) desc;

 

 

문제110. 위의 결과를 다시 출력하는데

직업이 SALESMAN 제외하고 출력하시오

select job, min(sal)

from emp

where job not like 'SALESMAN'

group by job

order by min(sal) desc;

 

선생님

select job, min(sal)

from emp

where job != 'SALESMAN'

group by job

order by min(sal) desc;

 

설명: 같지 않다 3가지

        != ,    <>,     ^=

 

 

문제111. 직업이 SALESMAN 사원들 중에서

가장 먼저 입사한 사원의 입사일을 출력하시오

 

select min(hiredate)

 from emp

 where job= 'SALESMAN';

 

 

 

화면 캡처: 2018-10-17 오후 7:12

 

 

이름 나오게 하고 싶으나

서브쿼리 가야지 있답니다

 

select ename

from emp

where job ='SALESMAN'

group by ename

order by min(hiredate);

***이게 되는 이유는

ename 개별항목 14

그룹화 해도 14개다 (동명이인 없으니까)

그래서 문법상 그룹으로 묶어도 오류없고

내용상 매칭시켜도 문제없어서

결과가 나온것이다.

 

 

AVG 함수

 " 평균을 출력하는 함수 "

:

 사원 테이블의 월급의 평균값을 출력하시오

select avg(sal)

 from emp;

 

 

문제112. 커미션의 평균값을 출력하시오

selcet avg(comm)

from emp;

 

14 중에 커미션 받는 애가 4 뿐이다.

다행히도

컴퓨터가 4 나눴다.

 

 

 

문제113. 위의 문제

selcet avg(comm)

from emp;

다시 해결하는데

nvl 함수로 null 처리를 해서

4 나누는게 아니라

14 나눠지게 하시오.

 

select avg(nvl(comm,0))

from emp;

 

 

설명: "group 함수는 null 값을 무시한다!!!!!!!!!!!!"

 

: 아래의 두개의 sql 중에 어느 sql 성능이

좋은 sql 인가

 

select sum(comm) from emp;

 

 

select sum(nvl(comm,0)) from emp;

 

같은 결과값을 갖는다.

위에 것이 성능좋은 sql 이다.

빅데이터를 다룰

위아래의 속도는 20 가까이 난다.

 

알아서 null 무시처리 하는데 굳이

nvl 코딩할 이유가 없다

 

문제114. 통신사, 통신사 평균나이를 출력하시오

select lower(telecom), round(avg(age))

from emp2

group by lower(telecom);

 

 

 

문제115. 위의 결과를 다시 출력하는데

평균나이가 높은것부터 출력하시오

 

select lower(telecom), round(avg(age)) 평균

from emp2

group by lower(telecom)

order by 평균 desc;

 

또는 간편하게

select lower(telecom), round(avg(age))

from emp2

group by lower(telecom)

order by 2 desc;

 

 

문제116. 위의 결과를 다시 출력하는데

lg 제외하고 출력하시오

 

select lower(telecom), round(avg(age)) 평균

from emp2

where lower(telecom) != 'lg'

group by lower(telecom)

order by 평균 desc;

 

 

문제117. 직업과 직업별 평균 월급을 출력하시오

select job, round(avg(sal))

from emp

group by job;

 

 

문제118. 직업별 평균월급중에서

최소값을 출력하시오(오늘의 마지막 문제)

 

select round(min(avg(sal)))

from emp

group by job;

 

결과 1038

 

 

 

문제119. 직업, 직업별 평균월급을 출력하는데

 직업별 평균월급이 높은것 부터 출력하시오

select job, round(avg(sal))

from emp

group by job

order by avg(sal) desc;

간편함을 위해 숫자 2 써도

 

 

 

문제120. 위의 결과를 다시 출력하는데

직업별 평균월급이 3000 이상인것만

출력하시오

select job, round(avg(sal))

from emp

where avg(sal) >=3000

group by job

order by avg(sal) desc;

 

에러나옴

에러 뜻이

그룹함수가

where 절에 허락하지 않는다.

 

설명:

group 함수로 검색 조건을 주는 것을

where 절에 없다.

group 함수로 검색 조건을 때는

having 절을 사용해야 한다.

 

where 단일행 작업을 수행하니까

group by 복합행 조건수행 안됨.

그래서 having by 라는 새로운 코딩을 .

 

 

맞게 작성하면

select job, avg(sal)

  from emp

  group by job

  having avg(sal) >= 3000

 

 

select job, round(avg(sal))

from emp

where sal >= 3000

group by job

order by 2 desc;

이거의 해석은?

3000 이상을 먼저 조건 정해놓고

직업별로 묶어서

sal 평균값을 내림차순으로 출력함

전체 평균이 아닌

3000 이상-->평균이라서

전체 월급의 평균에서

3천이상을 뽑는 것과는

다른값이 나옴.

 

 

 

select 문의 6가지

select

from

where

group by

having order by

 

오라클의 내부적 실행순서

from>>where>>group by>> having>> select>> order by

처음과 끝은 무조건 from/ order by

 

코딩순서

select           컬럼명 나열

>>from         테이블명

>>where      검색조건

>>group by  그룹핑할 컬럼명

>>having      그룹함수를 사용한 검색조건

>>order by   정렬해서 보고싶은 컬럼명

 

 

문제121. 직업, 직업별 토탈월급을 출력하는데

 직업이 SALESMAN 제외하고 출력하고

 직업별 토탈월급이 4000 이상인 것만 출력하고

 직업별 토탈월급이 높은것부터 출력하는데

 직업별 토탈월급을 출력할 때에 천단위를 부여하시오

select job, to_char(sum(sal), '999,999,999')토탈월급

from emp

group by job

having job != 'SALESMAN'

and

 sum(sal) >= 4000

 order by 토탈월급 desc;

 

 

 

 

정석대로

SELECT JOB, TO_CHAR(SUM(SAL), '999,999,999')

FROM EMP

WHERE JOB NOT LIKE 'SALESMAN'

GROUP BY JOB

HAVING SUM(SAL)>= 4000

ORDER BY SUM(SAL) DESC;

 

* 별칭지칭이 안되게????

>>>실행순서가

from - where - group by - having- select- order by

코딩에서

sum(sal) 대한 having 절이 제일 먼저

실행되는건데

group, having 절에는 별칭지정이 안된다.

그래서 그냥 풀네임 쓰는거다.

select 에서 한번 지정해주고

order by 에서 써먹겠네....

 

 

COUNT 함수

 " 데이터의 건수를 세는 함수"

 

: 사원 테이블의 전체 사원수가 몇명인가?

SELECT COUNT(EMPNO)

 FROM EMP;

또는

select count(*) from emp;

 

 

 

SELECT COUNT(EMPNO)

 FROM EMP;

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

select count(*) from emp;

 

2개의 값은 같다(=14)

그러나

위에것은 사원수만 센거라서

아래의 전체를 세서 출력한 코딩보다

훨씬 빠르다.

 

 

select count(1) from emp;

현업에서 많이 쓰는 방식

괄호안에 1이든 8이든 뭐든 넣어도 상관없다

지정 숫자를 항목만큼 센다는 뜻이다.

하지만 오라클 정규수업에서는

count(*) 쓰라고 권장한다.

 

 

문제121. 직업이 SALESMAN 사원들의

인원수를 출력해주시오

select count(job)

from emp

where job = 'SALESMAN';

 

선생님

SELECT COUNT(*)

FROM EMP

WHERE JOB= 'SALESMAN';

 

 

 

문제122. 직업, 직업별 인원수를 출력하시오

select job, count(*)

  from emp

  group by job;

 

 

문제123. 통신사, 통신사별 인원수를 출력하는데

통신사별 인원수가 5 이상인것만 출력하시오

select lower(telecom), count(*)

from emp2

group by telecom

having count(lower(telecom)) >='5';

***lower 있고 없고의 차이******

 

선생님답:

select lower(telecom), count(*)

from emp2

group by lower(telecom)

having count(*) >=5;

 

 

 

문제124. 커미션만 카운트 하시오

select count(comm)

from emp;

4개가 나온다

 

그룹함수는(avg, count....이런것들)

 

**그룹함수란

하나이상의 행을 그룹으로 묶어

연산하여 총합, 평균 하나의 결과로 나타낸다.

 

null 값을 무시한다.

 

**null 값도 세려면

select count(nvl(comm, '0'))

from emp;

 

 

 

 

문제125. 사원테이블의 직업의 종류는

가지가 있는가

 

select count(disticnt job)

from emp;

직업의 중복을 제거해서 카운트하라

=직업의 종류 파악

 

 

문제126. 우리반의 전공의 종류는 몇가지 있는가?

select count(distinct major)

from emp2;

 

 

 

문제127. 입사한 년도(4자리),

입사한 년도(4자리) 인원수를 출력하시오

 

:

select to_char(hiredate, 'rrrr'), count(*)

 from emp

group by to_char(hiredate, 'rrrr');

 

 

select count(*)

from emp

group by to_char(hiredate, 'rrrr');

이것도 가능

뜻은 count 숫자, 날짜 인식 가능.

 

*********입사일, 생일 같이

날짜로 기입된 테이블은

무조건

to_char, to_date 써서 출력할 *******

 

 

문제128. 전공과 전공별 인원수를 출력하는데

통계학과를 정보통계보험수리학과를 통계학과로

카운트해서

출력되게 하시오

절대!끝까지! 스스로 풀것 답보지 말것

*total 값도 rollup 으로 내보시오

 

1

SELECT DECODE(major, '정보통계보험수리학과', '통계학과', major), COUNT(*)

FROM emp2

GROUP BY DECODE(major, '정보통계보험수리학과', '통계학과', major);

 

 

2

select

 case when major like '%통계%' then '통계학과'

              else major end as "MAJOR", count(*)

from emp2

group by

 case when major like '%통계%' then '통계학과'

               else major end ;

 

오답

select

case when major = '정보통계보험수리학과' then '통계학과'

 else major end as 전공

, count(*)

from emp2

group by major ;

이렇게 출력하면

통계학과가 2개고, 4, 1 으로 출력된다.

 

**********

decode 연산자 안들어가고(like , = 이런거)

case when 써야한다.

( ex:  case when major = '통계학과' then '통계'

          else major end )

    

 

 

 

문제129. 부서번호, 부서번호별 토탈월급을 출력하시오

select deptno, sum(sal)

from emp

group by deptno;

 

 

*일반적으로 출력값은 세로로 나온다

근데 현업에서는 가로로 회전시켜서 출력한다

 

 

문제130. 부서번호, decode 이용해서 부서번호가

10번이면 월급이 출력되게 하고

10번이 아니면 null 출력되게 하시오

select deptno,

decode(deptno, 10,  sal,  null) as "10"

from emp;

 

 

deptno 지우고

전체 값을 더하고 싶으면

select sum(decode(deptno, 10,  sal,  null)) as "10"

from emp;

 

이런식으로

deptno 20, 30 나오게 해보시오

 

select sum(decode(deptno, 10,  sal,  null)) as "10",

           sum(decode(deptno, 20,  sal,  null))  as "20",

          sum(decode(deptno, 30,  sal,  null))  as "30"

from emp;

 

이렇게 결과를 가로로 있게끔 한다.

 

 

문제131. 직업, 직업별 인원수를 세로로 출력하시오

select job, count(*)

from emp

group by job;

 

 

문제132. 직업, 직업별 토탈월급을 가로로 출력하시오

 

select

 sum(decode(job, 'SALESMAN', sal,  null)) as "SALESMAN",

 sum(decode(job, 'CLERK',  sal,  null))  as "CLERK",

 sum(decode(job, 'PRESIDENT',  sal,  null))  as PRESIDENT",

 sum(decode(job, 'ANALYST', sal, null)) as "ANALYST"

 from emp;

 

 

 

 

문제133. 아래의 표대로

입사한 년도, 입사한 년도별 인원수를

가로로 출력하시오

(count 푸시오)

 

1980       1981      1982      1983  이런식으로.

 

 

선생님답

select

sum(decode(to_char(hiredate, 'rrrr'), '1980', 1, null)) as "1980",

sum(decode(to_char(hiredate, 'rrrr'), '1981', 1, null)) as "1981",

sum(decode(to_char(hiredate, 'rrrr'), '1982', 1, null)) as "1982",

sum(decode(to_char(hiredate, 'rrrr'), '1983', 1, null)) as "1983"

from emp;

 

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

select

count(decode(to_char(hiredate,'rrrr'), '1980', 1, 0)) as "1980",

count(decode(to_char(hiredate,'rrrr'), '1981', 1, 0)) as "1981",

count(decode(to_char(hiredate,'rrrr'), '1982', 1, 0)) as "1982",

count(decode(to_char(hiredate,'rrrr'), '1983', 1, 0)) as "1983"

from emp;

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

안되게요~?

 

>>>>>>>>>

count 했으니까, 0 하나의 숫자로 알고

세어버린거지.

count 답을 내고 싶으면 0->null 처리 하면 .

 

select

 count(decode(to_char(hiredate, 'rrrr'), '1980', 1, null)) as "1980",

 count(decode(to_char(hiredate, 'rrrr'), '1981',1, null)) as "1981",

 count(decode(to_char(hiredate, 'rrrr'), '1982', 1, null)) as "1982",

 count(decode(to_char(hiredate, 'rrrr'), '1983', 1, null)) as "1983"

 from emp;

 

 

 

문제134. 아래와 같이 결과를 출력하시오

(점심시간 문제)

 

select major,

sum(decode(lower(telecom), 'sk', 1,0)) as "sk",

sum(decode(lower(telecom), 'lg', 1,0)) as "lg",

sum(decode(lower(telecom), 'kt', 1,0)) as "kt"

from emp2

group by major;

 

 

 

 

문제135. (생각해야할 문제) 점심문제 다시 해결하는데 정보통계보험수리학과를

    통계학과에 포함시켜서

출력되게 하시오

 

select

case when major like '%통계%' then '통계학과'

else major end,

sum(decode(lower(telecom),'sk',1,0)) as "sk",

sum(decode(lower(telecom),'lg',1,0)) as "lg",

sum(decode(lower(telecom),'kt',1,0)) as "kt"

from emp2

group by case when major like '%통계%' then '통계학과'

else major end;

 

또는

select

case when major='정보통계보험수리학과'   then '통계학과'

else major end as MAJOR,

sum(decode(lower(telecom),'sk',1,0)) as "sk",

sum(decode(lower(telecom),'lg',1,0)) as "lg",

sum(decode(lower(telecom),'kt',1,0)) as "kt"

from emp2

group by case when major = '정보통계보험수리학과'  then '통계학과'

else major end;

 

 

 

문제 136. 직업, 직업별 최대월급, 직업별 최소월급,

직업별 평균월급을 출력하시오

 

select job, max(sal), min(sal), round(avg(sal))

from emp

group by job;

 

 

 

문제137. 통신사, 통신사별 최대나이,

 통신사별 최소나이,

 통신사별 평균나이,

 통신사별 인원수를 출력하시오

 

select lower(telecom), max(age), min(age), round(avg(age)), count(*)

from emp2

group by lower(telecom);

 

 

 

레포팅 함수

1. rollup      

2. cube

3. grouping

 

 

문제138. 직업, 직업별 토탈월급을 출력하시오(세로출력)

select job, sum(sal)

from emp

group by job;

 

 

 

화면 캡처: 2018-10-18 오후 2:04

 

근데

여기서

월급 더한 값도 넣고 싶다.

 

-ROLLUP 전체토탈값을 아래에 출력하는 함수다.

문제로 내용을 다뤄보겠다.

 

 

문제 139. 아래와 같이 직업, 직업별 토탈월급을

출력하는데  전체 토탈월급이 아래에 출력되게 하시오

select job, sum(sal)

from emp

group by rollup(job);

 

**gouping sets 해보면

select job, sum(sal)

from emp

group by grouping sets(job, () );

 

 

 

다른 항목도 추가해보면

select job, sum(sal), max(sal),  min(sal),  count(sal)

from emp

group by rollup(job);

 

 

 

문제140. 아래의 결과를 출력하는데

아래쪽에

전체 인원수가 나오게 출력하시오

 

select nvl(major, '전체인원수') as "전공",

sum(decode(lower(telecom),'sk',1,0)) as "sk",

sum(decode(lower(telecom),'lg',1,0)) as "lg",

sum(decode(lower(telecom),'kt',1,0)) as "kt"

from emp2

Group by rollup(major);

 

 

-CUBE

CUBE 전체토탈값을 위로 출력시키는 함수다.

문제를 통해 내용을 다뤄보겠다.

 

문제141. 직업과 직업별 토탈월급을 출력하는데

전체 토탈월급이

이번에는 위에 출력되게 하시오

 

select job, sum(sal)

from emp

group by cube(job);

 

괄호안에 sal 넣었다가 에러뜸;

왜냐면

rollup, cube 테이블 지정 하는거.

sum, avg 같은 함수값에는 지정 안함.

 

 

문제 142. 아래와 같이 결과를 출력하시오

select nvl(major, '전체인원수'),

sum(decode(lower(telecom),'sk',1,0)) as "sk",

sum(decode(lower(telecom),'lg',1,0)) as "lg",

sum(decode(lower(telecom),'kt',1,0)) as "kt"

from emp2

Group by cube(major);

 

 

 

문제143. 나이, 통신사와 인원수를 아래와 같이 출력하시오

select age,

sum(decode(lower(telecom), 'sk',1,0)) as "SK",

sum(decode(lower(telecom), 'lg', 1, 0)) as "LG",

sum(decode(lower(telecom), 'kt', 1, 0) )as "KT"

from emp2

group by  age;

 

 

 

문제144.  위의 결과를 아래와 같이 출력하시오

++(pivot  으로도 구하시오!!!!)

**힌트!!!! pivot 쓰면 group by 안해도

 

    23   24   25   26   27  28   29

sk

lg

kt

*** 보지 말고 풀어요!!!!!

 

: select lower(telecom),

sum(decode(age, 23, 1, 0)) as "23",

sum(decode(age, 24, 1, 0)) as "24",

sum(decode(age, 25, 1, 0)) as "25",

sum(decode(age, 26, 1, 0)) as "26",

sum(decode(age, 27, 1, 0)) as "27",

sum(decode(age, 28, 1, 0)) as "28",

sum(decode(age, 29, 1, 0)) as "29",

sum(decode(age, 30, 1, 0)) as "30",

sum(decode(age, 31, 1, 0)) as "31",

sum(decode(age, 32, 1, 0)) as "32",

sum(decode(age, 33, 1, 0)) as "33",

sum(decode(age, 34, 1, 0)) as "34"

from emp2

group by lower(telecom);

 

Group by 되게 고마운 애구나….ㅎㅎㅎㅎ

 

악성  sql 을 짰다

 

select telecom,

count(decode(telecom, 'sk', decode(age, 23, 1, null),

                      'lg', decode(age, 23, 1, null),

                      'kt', decode(age, 23, 1, null), null )) as "23",

count(decode(telecom, 'sk', decode(age, 24, 1, null),

                      'lg', decode(age, 24, 1, null),

                      'kt', decode(age, 24, 1, null), null )) as "24",

count(decode(telecom, 'sk', decode(age, 25, 1, null),

                      'lg', decode(age, 25, 1, null),

                      'kt', decode(age, 25, 1, null), null )) as "25",

count(decode(telecom, 'sk', decode(age, 26, 1, null),

                      'lg', decode(age, 26, 1, null),

                      'kt', decode(age, 26, 1, null), null )) as "26",

count(decode(telecom, 'sk', decode(age, 27, 1, null),

                      'lg', decode(age, 27, 1, null),

                      'kt', decode(age, 27, 1, null), null )) as "27"

                                                                                                             

from emp2

group by telecom;

 

 

    pivot : 세로 --------> 가로

   unpivot : 가로 ------- > 세로

 

예제:

select *

 from (select deptno, sal from emp)

 pivot( sum(sal) for deptno in (10, 20, 30) );

 

 

설명

from 에다 바로 emp 쓰면 모든 컬럼이 온다.

필요 컬럼만 갖다 쓰려면

 

from(select deptno, sal from emp)

 

지정해주고

pivot 이용해 가로화 시키려면

 

pivot(sum(sal) for deptno in (10, 20, 30) );

 

sum(더하고자 하는 )

for 앞의 값을 구하고자 하는 항목

in sum 구하고자 하는 항목의 해당값

 

 

문제145. 아래표를 pivot 으로 구하시오

select *

 from (select job, deptno, sal from emp)

 pivot( sum(sal) for deptno in (10, 20, 30) );

 

=

 

select job,

sum(decode(deptno,10,sal,0)) as "10",

sum(decode(deptno,20,sal,0)) as "20",

sum(decode(deptno,30,sal,0)) as "30"

from emp

group by job;

 

 

************sum(sal) 자리에 count(*) 넣으면

select *

 from (select job, deptno, sal from emp)

 pivot( count(*) for deptno in (10, 20, 30) );

 

 

 

문제145. 아래의 결과를 pivot 문으로 구현하시오

   23   24   25   26   27   28   30   31

sk  0       0       1........

lg   .

kt  .

 

선생님답

select *

 from(select lower(telecom), age from emp2)

 pivot(count(*) for age in (23,24,25,26,27,28,30,31));

 

=

select lower(telecom),

 sum(decode(age,23,1,0)) as "23",

.

.

.

.

sum(decode(age,31,1,0)) as "31"

from emp2;

=

select *

 from(select lower(telecom), age from emp2)

 pivot xml (count(*) for age in (select  distinct age from emp2)); ........

이건 그냥 참고

 

 

그래서

나이랑, 텔레콤에 대한 pivot 값을 count 처리하는거다.

 

 

 

범죄원인 데이터를 생성하시오

머신러닝 데이터 게시판

 

문제147. 살인을 유발시키는 가장 원인이

무엇인가

 

select *

 from crime_cause2

 where crime_type='살인'

 order by cnt desc;

 

 

문제148. 범죄유형(crime_type),

범죄유형별 총건수

(cnt :범죄유형벌 건수)

출력하는데

범죄유형별 총건수가 높은것부터

출력하시오

(테이블: crime_cause2)

 

select crime_type, sum(cnt)

from crime_cause2

group by crime_type

order by sum(cnt) desc;

 

 

범죄지역 데이터 입력

select *

from crime_loc2;

 

 

문제149. 살인이 일어나는 장소와

건수를 출력하는데

건수가 높은것 부터

출력하시오.

 

select crime_type, c_loc, cnt

from crime_loc2

where crime_type = '살인'

order by cnt desc;

 

 

 

문제150. 아파트에서 일어나는

범죄 유형과 건수를 출력하는데

건수가 높은 것부터 출력하시오

 

select *

from crime_loc2

where c_loc='아파트'

order by cnt desc;

 

 

 

전국 대학 등록금 데이터를 입력하시오

문제151. 대학이름, 등록금을 출력하는데

등록금이 높은 순서대로

출력하시오

 

***sqlgate

무료버전이라서 50개이상 항목

테이블 저장 안됨

sqlplus 써야함.

 

select university, college_fee

from univ

order by college_fee desc;

 

 

구글에

공공데이터포털

찾아 들어가면

범죄데이터 같은거 받을 있다

근데 범죄 받으면 경찰연락옴

 

 

문제152. 아래와 같이 결과를 출력하시오

(오늘의 마지막 문제)

**주의사항

  더블 쿼테이션 활용하시오***

***rollup 한거 "전체토탈" 이라고 나오게 하시오

힘으로 낑낑 거리면서 풀었어 ㅠㅠㅠ기쀼다

 

select nvl(job,'토탈값') 직업 ,

to_char(sum(decode(deptno , 10 , sal , 0 )), '999,999') "10" ,

to_char(sum(decode(deptno , 20 , sal , 0 )), '999,999') "20" ,

to_char(sum(decode(deptno , 30 , sal , 0 )), '999,999') "30" ,

to_char(sum( sal), '999,999') 토탈

from emp

group by rollup(job) ;

 

******select 절에 to_char 안했는데 알아서 토탈값에

  점이 들어간다. 왜지????

Decode to_char('999,999,999') 먹인게

Rollup 까지 들어간다 !!!!!!!!!!!!!!!!!

 

 

728x90
반응형

'sql' 카테고리의 다른 글

8. JOIN  (0) 2019.03.30
7. DATA 분석함수(rank, dens_rank, listagg, ntile, lead, lag)  (0) 2019.03.30
5. NVL, DECODE, CASE  (0) 2019.03.30
4. 날짜함수  (0) 2019.03.30
3. 단일행 함수  (0) 2019.03.30