본문으로 바로가기

DB-180306

category 프로그래밍/DB 2018. 3. 10. 22:54

 

(1)부하 직원이 가장 많은 직원 3명 의 평균급여를 구하고 그 값보다 이상인 사람은 20%감봉 아닌사람은 20%인상해서

 

바뀐 급여를 작성하시오

 

출력:사원명 급여등급 변경급여 부서명

 

 

----

SELECT E.ENAME,E.DEPTNO,

CASE

    WHEN   E.SAL >= F.AVG_SAL

    THEN   E.SAL * 0.8

    ELSE   E.SAL * 1.2

END AS RE_SAL

FROM

(SELECT *

FROM

(SELECT AVG(E.SAL) AS AVG_SAL

FROM

(SELECT *

FROM

(SELECT MGR,COUNT(MGR),

RANK() OVER(ORDER BY COUNT(*) DESC) AS RNK

FROM EMP

GROUP BY MGR)A

WHERE A.RNK <=3)B INNER JOIN EMP E ON B.MGR = E.EMPNO)G) F INNER JOIN EMP E ON 1=1;

 

 

 

 

 

 

 

 

 

--ALLEN 상사의 급여를 20% 감소시키고 SCOTT 급여를 10% 인상시킨 값의 차이를 구해라

 

 

ALLEN(MGR) 7698이고 그 7698에 대한 EMPNO 상사

--ENAME BLAKE

 

출력 : 두 값의 차이

 

 

시스템 생성 대체 텍스트:
ENAME 
7 3 69 5!{ITH 
7 4 99 ALLEN 
7 521 WARD 
7 5 70NE5 
7 65 4 MARTIN 
7 693 BLAE-E 
7 7 2 CLARK 
7 7 SCOTT 
JO日 
SALE 
ANALY ST 
MGR 
HIREDATE 
7902 30/12/17 
7693 31/02/20 
7693 31/02/22 
7339 31/04/02 
7693 31/09/23 
7339 31/05/01 
7339 31/06/09 
756637/04/19 
SAL 
1600 
1250 
2975 
1250 
2350 
2450 
3000 
COMM 
(긔긔1) 
(긔긔1) 
1400 
(긔긔1) 
(긔긔1) 
(긔긔1) 
DEPTNO

 

--ALLEN상사의 급여를 20%감소

SELECT ENAME, SAL,

CASE

    WHEN ENAME ='BLAKE'

    THEN SAL * 0.8

    ELSE SAL

END RE_SAL

FROM EMP

WHERE ENAME ='BLAKE'

;

 

--SCOTT 급여를 10%인상

SELECT ENAME, SAL,

CASE

    WHEN ENAME ='SCOTT'

    THEN SAL * 1.1

    ELSE SAL

END RE_SAL

FROM EMP

WHERE ENAME ='SCOTT'

;

 

 

두 차이를 구해라

SELECT ABS(A.RE_SAL -B.RE_SAL) AS CHA

FROM

(SELECT ENAME, SAL,

CASE

    WHEN ENAME ='BLAKE'

    THEN SAL * 0.8

    ELSE SAL

END RE_SAL

FROM EMP

WHERE ENAME ='BLAKE') A

 

INNER JOIN

 

(SELECT ENAME, SAL,

CASE

WHEN ENAME ='SCOTT'

THEN SAL * 1.1

ELSE SAL

END RE_SAL

FROM EMP

WHERE ENAME ='SCOTT')B ON 1=1

 

 

 

3.

-- 87년에 입사한 사원의 상급자들의 급여합계를 구하고 업무별 급여합계를 구한 뒤, 두 값을 비교하여 상급자들의 급여합계(MGR_SUM)가 업무별 급여합계 보다 작은 경우 그 업무에 해당하는 사원들의 급여를

-- 50퍼센트 인상하여 변경된 급여와 전체 정보 및 변경된 급여순위를 출력하시오.

 

 

--87년에 입사한 사원의 상급자들의 급여합계를 구하고

SELECT SUM(SAL)

FROM EMP

WHERE EMPNO IN

(SELECT MGR

FROM EMP

WHERE TO_CHAR(HIREDATE,'YY') = 87);

 

 

--업무별 급여합계와 비교하여 상급자 급여합계보다 급여가 낮은 사원들의 급여를 50퍼센트 인상하여 변경순위

 

SELECT SUM(SAL), JOB

FROM EMP

GROUP BY JOB

;

 

SELECT E1.JOB, E1.ENAME,

RANK() OVER(ORDER BY CASE

                        WHEN  E.MGR_SAL<E.JOB_SAL

                        THEN  E1.SAL * 1.5

                        ELSE  E1.SAL

                    END DESC) AS RNK,

                    CASE

                        WHEN  E.JOB_SAL <E.MGR_SAL

                        THEN  E1.SAL * 1.5

                        ELSE  E1.SAL

                    END AS RE_SAL

FROM

(SELECT *

FROM (SELECT SUM(SAL) AS JOB_SAL , JOB

FROM EMP

GROUP BY JOB) E INNER JOIN (SELECT SUM(SAL) AS MGR_SAL

                            FROM EMP

                            WHERE EMPNO IN

                                            (SELECT MGR

                                            FROM EMP

                                            WHERE TO_CHAR(HIREDATE,'YY') = 87))

                            ON 1=1)E INNER JOIN EMP E1 ON E.JOB=E1.JOB;

 

 

 

 

4.

--이름과 직업을 더하여 새로운 이름을 만들고 (중간에 스페이스 한 번 추가) 새로운이름의 길이값을 구하여 길이값이 11인 사람의 월급을 150%로 만들고,

-- 길이값이 12인 사람의 월급을 120%로 만들어 순위를 출력한 후, 사는 지역별로 총계급여합을 산출하여 1위인 지역을 구하시오.

 

 

 

---이름과 직업을 더하여 새로운 이름을 만들고

SELECT A.SUM_NAME

FROM

(SELECT ENAME || ' '|| JOB AS SUM_NAME

FROM EMP)A;

 

 

--새로운이름의 길이값을 구하여 길이값이 11인 사람의 월급을 150%로 만들고

SELECT DISTINCT B.SUM_NAME,B.NEW_LEN,E.SAL,

CASE

    WHEN B.NEW_LEN =11

    THEN E.SAL * 1.5

    ELSE E.SAL

END RE_SAL

FROM

(SELECT A.SUM_NAME, LENGTH(A.SUM_NAME) AS NEW_LEN

 

FROM

(SELECT ENAME || ' '|| JOB AS SUM_NAME

FROM EMP)A ) B INNER JOIN EMP E ON 1=1

 

;

 

길이값이 12인 사람의 월급을 120%로 만들어 순위를 출력한 후,

 

SELECT DISTINCT B.SUM_NAME,B.NEW_LEN,E.SAL,

CASE

    WHEN B.NEW_LEN =11

    THEN E.SAL * 1.5

    WHEN B.NEW_LEN = 12

    THEN E.SAL * 1.2

    ELSE E.SAL

END RE_SAL,

RANK() OVER (ORDER BY 

                        CASE

                            WHEN B.NEW_LEN =11

                            THEN E.SAL * 1.5

                            WHEN B.NEW_LEN = 12

                            THEN E.SAL * 1.2

                            ELSE E.SAL

                        END                     DESC) AS RNK

FROM

(SELECT A.SUM_NAME, LENGTH(A.SUM_NAME) AS NEW_LEN

 

FROM

(SELECT ENAME || ' '|| JOB AS SUM_NAME

FROM EMP)A ) B INNER JOIN EMP E ON 1=1

 

;

 

사는 지역별로 총계급여합을 산출하여 1위인 지역을 구하시오.

SELECT *

FROM

 

(SELECT D.LOC, SUM(F.RE_SAL), RANK() OVER(ORDER BY SUM(F.RE_SAL) DESC ) AS RANK

FROM

(SELECT DEPTNO,ENAME || ' '|| JOB AS SUM_NAME ,

LENGTH(ENAME || ' '|| JOB) AS LEN,

CASE

    WHEN LENGTH(ENAME || ' '|| JOB) =11

    THEN SAL * 1.5

    WHEN LENGTH(ENAME || ' '|| JOB) =12

    THEN SAL * 1.2

    ELSE SAL

END AS RE_SAL

 

FROM EMP)F  INNER JOIN DEPT D ON F.DEPTNO = D.DEPTNO

GROUP BY D.LOC)G

 

;

'프로그래밍 > DB' 카테고리의 다른 글

DB-130308  (501) 2018.03.10
DB-180307  (492) 2018.03.10
DB-180305  (474) 2018.03.05
DB-180302  (467) 2018.03.05
DB-180228  (491) 2018.03.02