#mysql #sql
Вопрос:
SQL Здесь вы можете видеть, что я пишу ниже код, который выдает идентификатор и зарплату, но мне нужны имя и зарплата
CREATE TABLE salary_data (
id INTEGER NOT NULL,
month INTEGER NOT NULL,
salary INTEGER NOT NULL
);
-- another TABLE
CREATE TABLE emp_data (
id INTEGER NOT NULL,
name TEXT NOT NULL);
-- insert some values
INSERT INTO salary_data VALUES (1, 3,50000);
INSERT INTO salary_data VALUES (2,4,45000);
INSERT INTO salary_data VALUES (3,3,36000);
INSERT INTO salary_data VALUES (4,5,72000);
INSERT INTO salary_data VALUES (1,6,49000);
INSERT INTO salary_data VALUES (4,4,51000);
INSERT INTO salary_data VALUES (2,5,64000);
INSERT INTO emp_data VALUES (1, "RAMESH");
INSERT INTO emp_data VALUES (2, "SURESH");
INSERT INTO emp_data VALUES (3, "NIKHIL");
INSERT INTO emp_data VALUES (4, "RAJEEV");
-- fetch some values
SELECT id,max(salary) FROM salary_data GROUP BY month;
Я думаю, что мне не хватает некоторых в последней строке
введите код здесь
Мне нужен такой тип вывода
имя зарплата,
рамеш 50000
как это
Комментарии:
1. Вы сделали первый шаг и пропустили второй. Вы нашли самую высокую зарплату в месяц. Теперь найдите сотрудников, которые зарабатывают так много. К сожалению, однако, ваша база данных не содержит информации о том, какой сотрудник что заработал. В вашей таблице salary_data отсутствует идентификатор сотрудника, чтобы связать зарплату с сотрудником. Или, подождите, идентификатор данных о зарплате должен быть идентификатором сотрудника?
2. Ваш запрос неверен. Вы группируетесь по месяцам, поэтому вы не можете выбрать идентификатор, потому что в месяц существует несколько идентификаторов. Вы находитесь в пресловутом режиме обмана MySQL, который допускает такие недопустимые запросы. Убедитесь, что вы вышли из этого режима, подав заявку
SET sql_mode = 'ONLY_FULL_GROUP_BY';
.
Ответ №1:
Вы сделали первый шаг и пропустили второй. Вы нашли самую высокую зарплату в месяц. Теперь найдите сотрудников, которые зарабатывают так много.
Вот один из способов сделать это:
select *
from salary_data s
join emp_data e on e.id = s.id -- s.id is a misnomer for s.emp_id
where (s.month, s.salary) in
(
select month, max(salary)
from salary_data
group by month
);
Вот еще один (возможен только с MySQL 8):
select *
from
(
select
id as emp_id, month, salary,
max(salary) over (partition by month) as max_salary_for_the_month
from salary_data
) s
join emp_data e on e.id = s.emp_id
where s.salary = s.max_salary_for_the_month
order by s.month;