본문 바로가기
2019/ORACLE

SQL 문제 및 문제풀이 (~JOIN)

by SOLYI 2019. 11. 19.

--(1)부서위치 코드가 1700인 곳에서 근무하는 사원의 성, 부서명, 직무명을 출력하시오


--(2)Steven King에게 보고하는 사원의 사원코드, 성, 급여를 출력하시오


--(3)Executive 부서의 사원번호, 성, 부서코드, 직무코드를 출력하시오


--(4)부서별로 평균급여를 출력하시오


--(5)입사년도별 부서별 평균 급여를 출력하시오


--(6)우리회사의 총인원및 입사년도별 인원을 출력하시오


--(7) 각 관리자보다 먼저 채용된 사원의 사원이름, 입사일, 관리자이름, 관리자의 입사일을 출력하시오


--(8) 각 부서별 평균급여가 6000을 초과한 부서이름과 평균 급여를 출력하시오

 

 

더보기
 
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
--(1)부서위치 코드가 1700인 곳에서 근무하는 사원의 성, 부서명, 직무명을 출력하시오
--1번풀이
select first_name, department_name, job_title
from employees e, departments d, jobs j
where e.department_id = d.department_id
    and e.job_id = j.job_id
    and location_id = 1700;
 
--2번풀이
select first_name, department_name, job_title
from employees e inner join departments d
on e.department_id = d.department_id
    inner join jobs j
    on e.job_id = j.job_id
where d.location_id=1700;
 
 
--(2)Steven King에게 보고하는 사원의 사원코드, 성, 급여를 출력하시오
--확인용
select employee_id, first_name
from employees
where employee_id = 100;
 
--셀프조인 쓰는 방법
select e1.employee_id, e1.last_name, e1.salary
from employees e1, employees e2
where e1.manager_id = e2.employee_id
    and e2.first_name = 'Steven'
        and lower(e2.last_name) = 'king';
 
--inner join 쓰는방법
select e1.employee_id, e1.last_name, e1.salary
from employees e1 inner join employees e2
    on e1.manager_id = e2.employee_id
where e2.first_name = 'Steven'
    and lower(e2.last_name) = 'king';
 
 
--(3)Executive 부서의 사원번호, 성, 부서코드, 직무코드를 출력하시오
select e.employee_id, e.last_name, e.department_id, e.job_id
from employees e, departments d
where e.department_id = d.department_id
    and lower(department_name) = 'executive';
    
select e.employee_id, e.last_name, e.department_id, e.job_id
from employees e inner join departments d
    on e.department_id = d.department_id
    where department_name = 'Executive';
 
 
--(4)부서별로 평균급여를 출력하시오
select nvl(department_id, 0), round(avg(salary))
from employees
group by department_id;
 
select d.department_name ,round(avg(salary)) as "부서별평균급여"
from employees e, departments d
where e.department_id = d.department_id
group by department_name;
 
--inner join 사용가능
select d.department_name ,round(avg(salary)) as "부서별평균급여"
from employees e inner join departments d
on e.department_id = d.department_id
group by department_name;
 
 
--(5)입사년도별 부서별 평균 급여를 출력하시오
select distinct to_char(hire_date,'yyyy')
from employees
order by to_char(hire_date,'yyyy');
 
select to_char(hire_date,'yyyy') as "hire_year", department_id, avg(salary) as avgsal
 
from employees
 
group by to_char(hire_date,'yyyy'), department_id
 
order by "hire_year", department_id;
 
 
 
--(6)우리회사의 총인원및 입사년도별 인원을 출력하시오.
select count(first_name),
count(decode(to_char(hire_date,'yyyy'), 20011)) as "2001",
count(decode(to_char(hire_date,'yyyy'), 20021)) as "2002",
count(decode(to_char(hire_date,'yyyy'), 20031)) as "2003",
count(decode(to_char(hire_date,'yyyy'), 20041)) as "2004",
count(decode(to_char(hire_date,'yyyy'), 20051)) as "2005",
count(decode(to_char(hire_date,'yyyy'), 20061)) as "2006",
count(decode(to_char(hire_date,'yyyy'), 20071)) as "2007",
count(decode(to_char(hire_date,'yyyy'), 20081)) as "2008"
from employees;
 
 
--(7) 각 관리자보다 먼저 채용된 사원의 사원이름, 입사일, 관리자이름, 관리자의 입사일을 출력하시오
select distinct manager_id from employees;
select * from employees;
 
select e1.last_name, e1.hire_date, e2.last_name, e2.hire_date
from employees e1, employees e2
where e1.manager_id = e2.employee_id
    and e1.hire_date < e2.hire_date
    order by e1.hire_date;
    
 
--(8) 각 부서별 평균급여가 6000을 초과한 부서이름과 평균 급여를 출력하시오.
select department_id, round(avg(salary))
from employees
group by department_id
having avg(salary) < 6000;
 
cs

 

반응형