SQL Challenges-1: Average experience for each scheme
32. Average experience for each scheme
From the following tables write a SQL query to display those managers who have average experience for each scheme.
Input:
Table: managing_body
Structure:
| Field | Type | Null | Key | Default | Extra | 
|---|---|---|---|---|---|
| manager_id | int(11) | NO | PRI | ||
| manager_name | varchar(255) | YES | |||
| running_years | int(11) | YES | 
Data:
| manager_id | manager_name | running_years | 
|---|---|---|
| 51 | James | 5 | 
| 52 | Cork | 3 | 
| 53 | Paul | 4 | 
| 54 | Adam | 3 | 
| 55 | Hense | 4 | 
| 56 | Peter | 2 | 
Table: scheme
Structure:
| Field | Type | Null | Key | Default | Extra | 
|---|---|---|---|---|---|
| scheme_code | int(11) | NO | PRI | ||
| scheme_manager_id | int(11) | NO | PRI | 
Data:
| scheme_code | scheme_manager_id | 
|---|---|
| 1001 | 51 | 
| 1001 | 53 | 
| 1001 | 54 | 
| 1001 | 56 | 
| 1002 | 51 | 
| 1002 | 55 | 
| 1003 | 51 | 
| 1004 | 52 | 
Sample Solution-1:
SQL Code(MySQL):
CREATE TABLE managing_body (manager_id int NOT NULL UNIQUE, manager_name varchar(255), running_years int);
INSERT INTO managing_body VALUES(51,'James',5);
INSERT INTO managing_body VALUES(52,'Cork',3);
INSERT INTO managing_body VALUES(53,'Paul',4);
INSERT INTO managing_body VALUES(54,'Adam',3);
INSERT INTO managing_body VALUES(55,'Hense',4);
INSERT INTO managing_body VALUES(56,'Peter',2);
CREATE TABLE scheme (scheme_code int NOT NULL , scheme_manager_id int NOT NULL, 
PRIMARY KEY(scheme_code,scheme_manager_id));
INSERT INTO scheme VALUES(1001,	51);
INSERT INTO scheme VALUES(1001,	53);
INSERT INTO scheme VALUES(1001,	54);
INSERT INTO scheme VALUES(1001,	56);
INSERT INTO scheme VALUES(1002,	51);
INSERT INTO scheme VALUES(1002,	55);
INSERT INTO scheme VALUES(1003,	51);
INSERT INTO scheme VALUES(1004,	52);
	   
SELECT s.scheme_code  , 
ROUND(SUM(m.running_years) * 1.0/NULLIF(COUNT(DISTINCT m.manager_id), 0) ,2) AS 'Average year of experience'
FROM scheme s JOIN managing_body m 
ON m.manager_id  = s.scheme_manager_id
GROUP BY s.scheme_code;
Sample Output:
scheme_code|Average year of experience|
-----------|--------------------------|
       1001|                      3.50|
       1002|                      4.50|
       1003|                      5.00|
       1004|                      3.00|
OR
Sample Solution-2:
SQL Code(MySQL):
CREATE TABLE managing_body (manager_id int NOT NULL UNIQUE, manager_name varchar(255), running_years int);
INSERT INTO managing_body VALUES(51,'James',5);
INSERT INTO managing_body VALUES(52,'Cork',3);
INSERT INTO managing_body VALUES(53,'Paul',4);
INSERT INTO managing_body VALUES(54,'Adam',3);
INSERT INTO managing_body VALUES(55,'Hense',4);
INSERT INTO managing_body VALUES(56,'Peter',2);
CREATE TABLE scheme (scheme_code int NOT NULL , scheme_manager_id int NOT NULL, 
PRIMARY KEY(scheme_code,scheme_manager_id));
INSERT INTO scheme VALUES(1001,	51);
INSERT INTO scheme VALUES(1001,	53);
INSERT INTO scheme VALUES(1001,	54);
INSERT INTO scheme VALUES(1001,	56);
INSERT INTO scheme VALUES(1002,	51);
INSERT INTO scheme VALUES(1002,	55);
INSERT INTO scheme VALUES(1003,	51);
INSERT INTO scheme VALUES(1004,	52);
	   
SELECT distinct scheme_code,
ROUND(y / n,2) AS 'Average year of experience'
FROM
(SELECT scheme_code, SUM(running_years) AS y, COUNT(*) AS n 
FROM scheme s 
INNER JOIN managing_body m ON s.scheme_manager_id = m.manager_id 
GROUP BY scheme_code) t;
Go to:
PREV : Students achieved 100 percent for the first year of each examination of every subject.
NEXT : Schemes executed by minimum number of employees.
SQL Code Editor:
Contribute your code and comments through Disqus.
