본문 바로가기

IT/Database

Sql Server #002

Workshop

1. 모든 직원의 급여 총액, 급여 평균, 최고 급여, 최소 급여를 표시 하십시오.

2. 직위가 동일한 직원의 수를 표시 하십시오.

3. 직원들 중에서 관리자의 수를 표시 하십시오.

4. 총 직원 수를 구하고 2000, 2001, 2002, 2003년에 입사한 직원 수를 표시하십시오.

5. 지급된 보너스의 평균값을 구하십시오. (보너스가 없는 경우는 0으로 적용하세요)

6. 최고 급여가 10000원이 넘는 부서번호와 평균급여를 표시 하십시오.

7. 영업부 부서에서 근무하는 모든 직원의 이름, 직위, 부서번호, 부서이름을

   표시 하십시오.

8. 직원의 이름, 사번, 관리자 이름, 사번을 표시 하십시오.

9. 관리자가 지정되지 않은 직원도 포함하여 직원의 이름, 사번, 관리자 이름, 관리자의 사번을 표시 하십시오.(관리자가 지정되지 않은 경우 관리자의 이름과 사번은 ‘없음’으로 표시하세요)

10. 관리자 보다 먼저 입사한 모든 직원의 이름, 입사일, 관리자 이름,

    관리자 입사일을 표시 하십시오.

11. 보너스를 받는 직원의 이름, 부서 번호, 부서 이름을 표시 하십시오.




DROP TABLE grade;

DROP TABLE member;

DROP TABLE dept;


CREATE TABLE dept

    ( dept_id    int

    , dept_name  VARCHAR(30)

    , loc_id      int

    ,CONSTRAINT deptid_pk

        PRIMARY KEY (dept_id));


CREATE TABLE member 

    ( member_id    int

    , name      VARCHAR(25) NOT NULL

    , hire      DATE

    , jikwi     VARCHAR(10)

    , sal   int

    , bonus int

    , mgr     int

    , dept_id  int

    ,CONSTRAINT     member_member_id_pk

                     PRIMARY KEY (member_id)

    ,CONSTRAINT     member_deptid_fk

                     FOREIGN KEY (dept_id)

                      REFERENCES dept) ;



INSERT INTO dept VALUES (10,'총무부',100);

INSERT INTO dept VALUES (20,'인사부',200);

INSERT INTO dept VALUES (30,'영업부',300);

INSERT INTO dept VALUES (40,'감사팀',400);

INSERT INTO dept VALUES (50,'전산팀',500);



INSERT INTO member VALUES(100,'배기수', '1987-05-04','사장', 54000, 40, NULL,10);

INSERT INTO member VALUES(101,'홍길동', '1990-06-17','부장', 12000, 30, 100,20);

INSERT INTO member VALUES(102,'차승호', '2001-06-03','부장', 11000, 10, 100,30);

INSERT INTO member VALUES(103,'김주부', '2000-01-01','과장', 14000, NULL, 102,30);

INSERT INTO member VALUES(104,'황기훈', '2001-01-15','과장', 30000, NULL, 101,20);

INSERT INTO member VALUES(105,'정수미', '2003-12-10','대리', 24000, NULL, 104,20);

INSERT INTO member VALUES(106,'권민수', getdate(),'사원', 4000, NULL, NULL, 50);

INSERT INTO member VALUES(107,'김지희', getdate(),'사원', 5000, NULL, 105, NULL);


CREATE TABLE grade

(grade_level VARCHAR(3),

 lowest_sal  int,

 highest_sal int

 );


INSERT INTO grade

VALUES ('A', 1000, 2999);


INSERT INTO grade

VALUES ('B', 3000, 5999);


INSERT INTO grade

VALUES('C', 6000, 9999);


INSERT INTO grade

VALUES('D', 10000, 14999);


INSERT INTO grade

VALUES('E', 15000, 24999);


INSERT INTO grade

VALUES('F', 25000, 40000);


--1. 모든 직원의 급여 총액, 급여 평균, 최고 급여, 최소 급여를 표시 하십시오.

select sum(sal) 총액, avg(sal)평균, max(sal) 최고급여, min(sal) 최소급여 from member


--2. 직위가 동일한 직원의 수를 표시 하십시오.

select jikwi, count(*) from member group by jikwi 


--3. 직원들 중에서 관리자의 수를 표시 하십시오.

select count(distinct mgr) from member


--4. 총 직원 수를 구하고 2000, 2001, 2002, 2003년에 입사한 직원 수를 표시하십시오. (x)



--5. 지급된 보너스의 평균값을 구하십시오. (보너스가 없는 경우는 0으로 적용하세요)

select avg(case 

when bonus is null then 0

else bonus

end) as 평균연봉

from member


select avg(isnull(bonus, 0)) from member


--6. 최고 급여가 10000원이 넘는 부서번호와 평균급여를 표시 하십시오.

select dept_id, max(sal) 최고급여, avg(sal)  평균급여 from member  group by dept_id 

HAVING  max(sal)  > 10000;


--7. 영업부 부서에서 근무하는 모든 직원의 이름, 직위, 부서번호, 부서이름을 

--   표시 하십시오.

select name, jikwi, member.dept_id, dept_name from member, dept where member.dept_id = dept.dept_id and dept_name = '영업부'



--8. 직원의 이름, 사번, 관리자 이름, 사번을 표시 하십시오.

select * from member

select a.name, a.member_id, m.name, m.member_id from member a, member m where a.mgr = m.member_id



select name, (case 

when bonus is null then sal*12

else sal*12+bonus

end) as 연봉

from member


--9. 관리자가 지정되지 않은 직원도 포함하여 직원의 이름, 사번, 관리자 이름, 관리자의 사번을 표시 하십시오.(관리자가 지정되지 않은 경우 관리자의 이름과 사번은 ‘없음’으로 표시하세요)

select * from member

select a.name 이름, a.member_id 사번, (case 

when a.mgr is null then '없음'

else b.name

end

) as 관리자이름

, (case 

when a.mgr is null then '없음'

else convert(varchar, b.member_id)

end

) as 관리자사번

 from member a left join member b on a.mgr = b.member_id 


--10. 관리자 보다 먼저 입사한 모든 직원의 이름, 입사일, 관리자 이름, 

--    관리자 입사일을 표시 하십시오.

select * from member

select a.name, a.hire, b.name, b.hire from member a inner join member b on a.mgr = b.member_id

where a.hire < b.hire


--11. 보너스를 받는 직원의 이름, 부서 번호, 부서 이름을 표시 하십시오.

select * from member

select * from dept

select name, m.dept_id, dept_name from member m , dept d where m.dept_id = d.dept_id and m.bonus is not null

'IT > Database' 카테고리의 다른 글

[MS-SQL] SA 계정 잠겼을 때 관리자 계정 생성법(DAC)  (0) 2023.07.12
[MSSQL] 계정 이관 절차  (0) 2020.12.08
SQL Server #001  (0) 2017.03.27
#002 MSSQL  (0) 2017.02.27