1. Employee Names who are indiviudal cotributors
2. Total number of Managers
3. Manager Name, Employee count
4. Manager Name, total salary of thier employees
a. including Manager
b. excluding Manager
5. Manager names with their employees avg salary
6. Manager names with any of their employee salary < 10L
7. Managers having less salary with any of their employee
8. Employee names having more salary than their Managers
9. select all manager names
10. second heighest salary of employee
11. Heighest and lowest salary of employee, manager
Employee, Department
1. Avg salary of employees in a Department
2. Higest, lowest salary of employees in a department
CREATE TABLE departments ( department_id NUMBER(2) CONSTRAINT departments_pk PRIMARY KEY, department_name VARCHAR2(14), location VARCHAR2(13) ); INSERT INTO departments VALUES (10,'ACCOUNTING','NEW YORK'); INSERT INTO departments VALUES (20,'RESEARCH','DALLAS'); INSERT INTO departments VALUES (30,'SALES','CHICAGO'); INSERT INTO departments VALUES (40,'OPERATIONS','BOSTON'); COMMIT; CREATE TABLE employees ( employee_id NUMBER(4) CONSTRAINT employees_pk PRIMARY KEY, employee_name VARCHAR2(10), job VARCHAR2(9), manager_id NUMBER(4), hiredate DATE, salary NUMBER(7,2), commission NUMBER(7,2), department_id NUMBER(2) CONSTRAINT emp_department_id_fk REFERENCES departments(department_id) ); INSERT INTO employees VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20); INSERT INTO employees VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30); INSERT INTO employees VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30); INSERT INTO employees VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20); INSERT INTO employees VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30); INSERT INTO employees VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30); INSERT INTO employees VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10); INSERT INTO employees VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20); INSERT INTO employees VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10); INSERT INTO employees VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30); INSERT INTO employees VALUES (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20); INSERT INTO employees VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30); INSERT INTO employees VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20); INSERT INTO employees VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10); COMMIT; |
Qtn numbers are not in sync with Answers:
1. Employee Names who are individual contributors
select employee_id, employee_name
from employees emp
where emp.employee_id not in
(select distinct manager_id from employees mgr where mgr.manager_id is not null)
2. Total number of Managers
select count(distinct mgr.employee_id)
--select distinct mgr.employee_id, mgr.employee_name
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id;
3. Manager Name, Employee count
select mgr.employee_id mgrId, mgr.employee_name MgrName, count(emp.employee_id) tot_emp
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id
group by mgr.employee_id, mgr.employee_name;
4. Manager Name, total salary of thier employees
a. including Manager
select mgr.employee_id mgrId, mgr.employee_name MgrName,
count(emp.employee_id) tot_emp, sum(emp.salary) tot_emp_sal, sum(emp.salary + mgr.salary) tot_mgr_emp_sal
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id
group by mgr.employee_id, mgr.employee_name;
b. excluding Manager
select mgr.employee_id mgrId, mgr.employee_name MgrName,
count(emp.employee_id) tot_emp, sum(emp.salary) tot_emp_sal
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id
group by mgr.employee_id, mgr.employee_name;
5. Manager names with their employees avg salary
select mgr.employee_id mgrId, mgr.employee_name MgrName,
count(emp.employee_id) tot_emp, avg(emp.salary) avg_emp_sal
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id
group by mgr.employee_id, mgr.employee_name;
6. Manager names with any of their employee salary < 10L
select mgr.employee_id mgrId, mgr.employee_name MgrName
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id
and emp.salary <= 1000
group by mgr.employee_id, mgr.employee_name;
7. Managers having less salary with any of their employee
select mgr.employee_id mgrId, mgr.employee_name MgrName
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id
and mgr.salary < emp.salary
group by mgr.employee_id, mgr.employee_name;
8. Employee names having more salary than their Managers
select emp.employee_id EmpId, emp.employee_name EmpName
from employees mgr,
employees emp
where mgr.employee_id = emp.manager_id
and emp.salary > mgr.salary
group by emp.employee_id, emp.employee_name;
9. select all manager names
select employee_id mgr_id, employee_name mgr_name
from employees emp
where emp.employee_id in
(select distinct manager_id from employees mgr where mgr.manager_id is not null)
10. second highest salary of any employee in an organization
select employee_id, employee_name from employees emp
where 2 = (select count(distinct salary) from employees emp1
where emp.salary<=emp1.salary);
11. Highest and lowest salary of employee, manager
emp:
select * from (
select employee_id, employee_name, salary from employees emp1
where not exists (select 1 from employees emp2 where emp1.employee_id = emp2.manager_id)
order by salary desc)
where rownum=1;
option-2:
select * from
(select employee_id, employee_name, salary,
row_number() over (order by salary desc) sal_rank
from employees emp1
where not exists (select 1 from employees emp2 where emp1.employee_id = emp2.manager_id)
) emp
where emp.sal_rank <=1;
option-3:
select * from
(select employee_id, employee_name, salary,
row_number() over (order by salary desc) sal_rank
from employees emp1
where emp1.employee_id not in (select distinct manager_id from employees emp2 where manager_id is not null)
) emp
where emp.sal_rank <=3;
Manager:
select * from (
select employee_id mgrId, employee_name mgrName, salary from employees mgr
where exists (select 1 from employees emp where emp.manager_id=mgr.employee_id) order by salary desc
) mgr
where ROWNUM=1;
option-2:
select * from
(select employee_id, employee_name, salary,
row_number() over (order by salary desc) sal_rank
from employees emp1
where emp1.employee_id in (select distinct manager_id from employees emp2 where manager_id is not null)
) emp
where emp.sal_rank <=3;
both:
select * from (
select employee_id, employee_name, salary, 'Emp' emp_type from employees emp1
where not exists (select 1 from employees emp2 where emp1.employee_id = emp2.manager_id)
order by salary desc)
where rownum=1
union
select * from (
select employee_id, employee_name, salary, 'Mgr' emp_type from employees mgr
where exists (select 1 from employees emp where emp.manager_id=mgr.employee_id) order by salary desc
) mgr
where ROWNUM=1;
Union -> removes duplicates
Union All -> returns duplicate records
Employee, Department
1. Avg salary of employees in a Department
select dept.department_id, dept.department_name, avg(emp.salary)
from employees emp,
departments dept
where dept.department_id = emp.department_id
group by dept.department_id, dept.department_name;
2. Higest, lowest salary of employees in a department
select dept.department_id, dept.department_name, max(emp.salary), min(emp.salary)
from employees emp,
departments dept
where dept.department_id = emp.department_id
group by dept.department_id, dept.department_name;