CREATE TABLE Employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50),
    manager_id INT,
    department VARCHAR(30),
    salary INT
);

insert into Employees(emp_id,emp_name,manager_id,department,salary)
values
(1,'Alice',NULL,'HR',90000),
(2,'Bob',1,'HR',60000),
(3,'Charlie',1,'HR',55000),
(4,'David',2,'IT',70000),
(5,'Eva',2,'IT',65000),
(6,'Frank',4,'IT',50000),
(7,'Grace',4,'Finance',80000),
(8,'Henry',7,'Finance',45000),
(9,'Ivy',7,'Finance',48000),
(10,'Jack',NULL,'Sales',95000);

-- Show every employee along with their manager's name.
-- Expected columns
-- | Employee | Manager |

select E1.emp_name as Employee,E2.emp_name as Manager
from Employees as E1
left join Employees as E2
on E1.manager_id = E2.emp_id;

-- List employees who do not have a manager.

select E1.emp_name as Employee,E2.emp_name as Manager
from Employees as E1
left join Employees as E2
on E1.manager_id = E2.emp_id
where E1.manager_id is null;

-- Find all managers.
-- (No duplicates.)

select distinct E2.emp_name as Manager
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id;

-- Show employees whose manager belongs to a different department.
-- Output
-- | Employee | Employee_Department | Manager | Manager_Department |

select E1.emp_name as Employee,E1.department as Employee_Department,E2.emp_name as Manager,
    E2.department as Manager_Department
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id;

-- Show employee salary and manager salary.

select E1.emp_name as Employee,E1.salary as Employee_salary,E2.emp_name as Manager,
    E2.salary as Manager_salary
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id;

-- Find employees earning more than their manager.

select E1.emp_name as Employee,E1.salary as Employee_salary
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id
where E1.salary>E2.salary;

-- Find employees earning exactly the same salary as their manager.

select E1.emp_name as Employee,E1.salary as Employee_salary
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id
where E1.salary=E2.salary;

-- Show every manager and the number of employees 
-- reporting directly to them.

select E2.emp_name,count(E1.emp_id) as emp_count
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id
group by E2.emp_id,E2.emp_name;

-- Find employees whose manager also has a manager.

select E1.emp_name as Employee,E2.emp_name
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id
where E2.manager_id is not null; 

-- Find managers with more than two direct reports.

select E2.emp_name as Manager,count(E1.emp_name) as direct_report
from Employees as E1
join Employees as E2
on E1.manager_id = E2.emp_id
group by E2.emp_id,E2.emp_name
having count(E1.emp_name)>2;

-- Show employees together with their grandmanager.

SELECT
    e.emp_name AS employee,
    m.emp_name AS manager,
    gm.emp_name AS grandmanager
FROM Employees e
JOIN Employees m
    ON e.manager_id = m.emp_id
JOIN Employees gm
    ON m.manager_id = gm.emp_id;

-- Find employees whose manager also has a manager.

select E.emp_name as Employee
from Employees as E
join Employees as M 
on E.manager_id = M.emp_id
    join Employees as GM
on M.manager_id = GM.emp_id;

-- Find employees who report to the same manager.		
	-- Output		
	-- | Employee1 | Employee2 | Manager |		
	-- Avoid duplicate pairs.		


select E1.emp_name as Employee1,E2.emp_name as Employee2,M.emp_name as Manager
from Employees as E1
join Employees as E2 
on E1.manager_id = E2.manager_id
and E1.emp_id<E2.emp_id
join Employees as M 
on E2.manager_id = M.emp_id;

-- Find every pair of employees working in the same department.			

select E1.emp_name as Employee1,E2.emp_name as Employee2
from Employees as E1
join Employees as E2 
on E1.department = E2.department
and E1.emp_id<E2.emp_id;

-- Find the highest-paid employee under each manager.		

select 
  case when E1.salary>E2.salary then E1.emp_name
    when E2.salary>E1.salary then E2.emp_name end as high_paid_emp, 
    M.emp_name as Manager
    from Employees as E1
join Employees as E2 
on E1.manager_id = E2.manager_id
and E1.emp_id<E2.emp_id
join Employees as M 
on E2.manager_id = M.emp_id; 

-- Find managers whose salary is 
-- lower than at least one of their direct reports.

select * from 
(select 
  case when E1.salary>M.salary or E2.salary>M.salary 
    then M.emp_name end as low_salary_manager,M.salary as Manager_salary    
    from Employees as E1
join Employees as E2 
on E1.manager_id = E2.manager_id
and E1.emp_id<E2.emp_id
join Employees as M 
on E2.manager_id = M.emp_id) as a 
where low_salary_manager is not null;



CREATE TABLE Products (	
    product_id INT,	
    product_name VARCHAR(50),	
    category VARCHAR(30),	
    price INT	
);	

insert into Products(product_id,product_name,category,price)
values
(1,'Laptop A','Laptop',70000),
(2,'Laptop B','Laptop',85000),
(3,'Laptop C','Laptop',70000),
(4,'Phone A','Phone',30000),
(5,'Phone B','Phone',25000),
(6,'Phone C','Phone',30000),
(7,'Tablet A','Tablet',40000);

-- Find products having the same price.	

select distinct P1.product_name,P2.product_name,P1.price
from Products as P1
join Products as P2 
on P1.price = P2.price
and P1.product_id<P2.product_id;



-- Find products in the same category.	

select distinct P1.product_name,P2.product_name,P1.category
from Products as P1
join Products as P2 
on P1.category = P2.category
and P1.product_id<P2.product_id;

-- Find products that have both the same category and same price.			

select P1.product_name,P1.price,
    P2.product_name,P2.price,
    P1.category,P2.category
    
from Products as P1
join Products as P2 
on P1.category = P2.category
and P1.product_id<P2.product_id
and P1.price = P2.price;














Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: