SQL Programming Practice Papers – Set 5 & Set 6 (With Answers)
Set 5
Section A: Advanced Filtering & Aggregations
1. Q1. Find employees earning within top 10% salaries.
SELECT * FROM Employees WHERE Salary >= (
SELECT PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY Salary) OVER ()
);
2. Q2. Find employees who joined in last 6 months.
SELECT * FROM Employees WHERE JoinDate >= DATE_SUB(CURDATE(), INTERVAL 6
MONTH);
3. Q3. Department-wise highest paid employee.
SELECT * FROM Employees E WHERE Salary = (
SELECT MAX(Salary) FROM Employees WHERE DeptID = E.DeptID
);
4. Q4. Departments where no one earns more than 70,000.
SELECT DeptID FROM Employees GROUP BY DeptID HAVING MAX(Salary) <= 70000;
5. Q5. Total, max, min salary by department.
SELECT DeptID, SUM(Salary), MAX(Salary), MIN(Salary) FROM Employees GROUP BY
DeptID;
Section B: Case, Ranking, and Advanced Joins
6. Q6. Classify employees into salary grades.
SELECT *, CASE
WHEN Salary >= 90000 THEN 'A'
WHEN Salary >= 70000 THEN 'B'
ELSE 'C' END AS Grade FROM Employees;
7. Q7. List top earning employee in each department.
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY DeptID ORDER BY Salary DESC) AS rn
FROM Employees
) AS sub WHERE rn = 1;
8. Q8. List employees with department and manager name.
SELECT E.FirstName, D.DeptName, M.FirstName AS ManagerName
FROM Employees E
JOIN Departments D ON E.DeptID = D.DeptID
JOIN Employees M ON E.ManagerID = M.EmpID;
9. Q9. Employees with duplicate salaries.
SELECT * FROM Employees WHERE Salary IN (
SELECT Salary FROM Employees GROUP BY Salary HAVING COUNT(*) > 1
);
10. Q10. List employees who joined in same month as someone else.
SELECT * FROM Employees E1 WHERE EXISTS (
SELECT 1 FROM Employees E2
WHERE MONTH(E1.JoinDate) = MONTH(E2.JoinDate) AND E1.EmpID <> E2.EmpID
);
Set 6
Section C: Subqueries, CTEs, and Window Analytics
11. Q11. Using CTE, calculate average salary per department and list employees above that.
WITH DeptAvg AS (
SELECT DeptID, AVG(Salary) AS AvgSal FROM Employees GROUP BY DeptID
)
SELECT E.* FROM Employees E
JOIN DeptAvg D ON E.DeptID = D.DeptID
WHERE E.Salary > D.AvgSal;
12. Q12. Rank employees based on JoinDate company-wide.
SELECT *, RANK() OVER (ORDER BY JoinDate ASC) AS JoinRank FROM Employees;
13. Q13. Show department-wise salary percentile (75%).
SELECT DISTINCT DeptID, PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY Salary)
OVER (PARTITION BY DeptID) AS Perc75
FROM Employees;
14. Q14. Cumulative average salary by department.
SELECT *, AVG(Salary) OVER (PARTITION BY DeptID ORDER BY JoinDate ROWS BETWEEN
UNBOUNDED PRECEDING AND CURRENT ROW) AS CumAvg
FROM Employees;
15. Q15. Get last 3 joiners in IT department.
SELECT * FROM (
SELECT *, RANK() OVER (PARTITION BY DeptID ORDER BY JoinDate DESC) AS rk FROM
Employees
) AS sub
WHERE DeptID = (SELECT DeptID FROM Departments WHERE DeptName = 'IT') AND rk <=
3;
Section D: Real-World Scenarios & Optimization
16. Q16. Find revenue per category for last quarter.
SELECT Category, SUM(Amount) AS Revenue FROM Orders
WHERE OrderDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 3 MONTH) AND
CURDATE()
GROUP BY Category;
17. Q17. Detect customers who placed orders every month this year.
SELECT CustomerID FROM Orders
WHERE YEAR(OrderDate) = YEAR(CURDATE())
GROUP BY CustomerID
HAVING COUNT(DISTINCT MONTH(OrderDate)) = 12;
18. Q18. Identify employees without recent performance review.
SELECT * FROM Employees WHERE EmpID NOT IN (
SELECT EmpID FROM PerformanceReviews
WHERE ReviewDate >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);
19. Q19. Optimize: replace correlated subquery with join.
-- Original:
SELECT * FROM Employees WHERE DeptID IN (SELECT DeptID FROM Departments WHERE
Location = 'Delhi');
-- Optimized:
SELECT E.* FROM Employees E JOIN Departments D ON E.DeptID = D.DeptID WHERE
D.Location = 'Delhi';
20. Q20. Identify customers with order gaps > 90 days.
SELECT CustomerID, OrderDate,
LAG(OrderDate) OVER (PARTITION BY CustomerID ORDER BY OrderDate) AS PrevOrder,
DATEDIFF(OrderDate, LAG(OrderDate) OVER (PARTITION BY CustomerID ORDER BY
OrderDate)) AS GapDays
FROM Orders
HAVING GapDays > 90;