I'm new to SQL and I've been trying around with creating views for my database. When I introduced aggregate functions I quickly stumbled upon this problem;
So in my database there are two tables: a table for user/employee data and one with groups (e.g. 'Accounting', 'Support' etc.).
I want to use a query/view to return an entire employee entry per group for the employee in that group with the min/max salary (of the group).
Here are the tables:
--- employee data ---
CREATE TABLE `db_java-sql-hookup`.`tbl_employee-data` (
`ID_Employee` bigint UNIQUE NOT NULL AUTO_INCREMENT,
`fk_IDGroup` tinyint,
`EmployeeName` varchar(30) UNIQUE NOT NULL,
`Email` varchar(255) NOT NULL,
`Password` varchar(255) NOT NULL,
`Salary` int,
PRIMARY KEY (`ID_Employee`),
FOREIGN KEY (`fk_IDGroup`) REFERENCES `db_java-sql-hookup`.`tbl_groups`(`pk_IDGroup`)
);
INSERT INTO `db_java-sql-hookup`.`tbl_employee-data` (`EmployeeName`, `Email`, `Password`)
VALUES
("TestA", "TestA@web.com", "1234"),
("TestB", "TestB@web.com", "1234"),
("TestC", "TestC@web.com", "abcde"),
("TestD", "TestD@web.com", "0000"),
("TestE", "TestE@web.com", "g8t3");
### Set Groups ###
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `fk_IDGroup` = 1 WHERE `tbl_employee-data`.`ID_Employee` = 1;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `fk_IDGroup` = 1 WHERE `tbl_employee-data`.`ID_Employee` = 2;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `fk_IDGroup` = 1 WHERE `tbl_employee-data`.`ID_Employee` = 3;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `fk_IDGroup` = 2 WHERE `tbl_employee-data`.`ID_Employee` = 4;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `fk_IDGroup` = 2 WHERE `tbl_employee-data`.`ID_Employee` = 5;
### Set Salaries ###
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `Salary` = 1000 WHERE `tbl_employee-data`.`ID_Employee` = 1;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `Salary` = 500 WHERE `tbl_employee-data`.`ID_Employee` = 2;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `Salary` = 2000 WHERE `tbl_employee-data`.`ID_Employee` = 3;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `Salary` = 750 WHERE `tbl_employee-data`.`ID_Employee` = 4;
UPDATE `db_java-sql-hookup`.`tbl_employee-data`
SET `Salary` = 300 WHERE `tbl_employee-data`.`ID_Employee` = 5;
--- group data ---
CREATE TABLE `db_java-sql-hookup`.`tbl_groups` (
`pk_IDGroup` tinyint UNIQUE NOT NULL AUTO_INCREMENT,
`GroupName` varchar(40) NOT NULL,
PRIMARY KEY (`pk_IDGroup`)
);
INSERT INTO `db_java-sql-hookup`.`tbl_groups` (`GroupName`)
VALUES
("Accounting"),
("Support"),
("Development"),
("Test");
Prior, I worked on these views (which I would like to combine):
### MaxSalaryEmp ###
DROP VIEW IF EXISTS `db_java-sql-hookup`.`view_MaxSalaryEmployee`;
CREATE VIEW `db_java-sql-hookup`.`view_MaxSalaryEmployee` AS
SELECT `ID_Employee`, `EmployeeName`, `Salary`
FROM `db_java-sql-hookup`.`tbl_employee-data`
WHERE `Salary` =
(SELECT MAX(`Salary`) FROM `db_java-sql-hookup`.`tbl_employee-data`);
### Avg,Min,Max Group Salary ###
DROP VIEW IF EXISTS `db_java-sql-hookup`.`view_CombinedGroupSalary`;
CREATE VIEW `db_java-sql-hookup`.`view_CombinedGroupSalary` AS
SELECT `GroupName`,
AVG(`Salary`) AS `AvgSalary`,
MIN(`Salary`) AS `MinSalary`,
MAX(`Salary`) AS `MaxSalary`
FROM `db_java-sql-hookup`.`tbl_groups` AS grp
LEFT JOIN `db_java-sql-hookup`.`tbl_employee-data` AS emp
ON grp.`pk_IDGroup` = emp.`fk_IDGroup`
GROUP BY `GroupName`
ORDER BY `GroupName`;
I've tried something like this:
SELECT `GroupName`, `ID_Employee`, `EmployeeName`, `Salary`,
MAX(`Salary`) AS `MaxSalary`
FROM `db_java-sql-hookup`.`tbl_groups` AS grp
LEFT JOIN `db_java-sql-hookup`.`tbl_employee-data` AS emp
ON grp.`pk_IDGroup` = emp.`fk_IDGroup`
GROUP BY `GroupName`
ORDER BY `GroupName`;
I want the final result to look like this: https://i.stack.imgur.com/xsmLT.png
(except, it should give out the proper employees instead of whatever is happening here)
Thank you in advance!