2015-05-23 3 views
1

Предположим, таблица 'работников:Выбор строк на основе условной GROUP BY

сотрудников стол

[id|name|department|sex|salary] 

Есть ли способ, чтобы отобразить все отделы, где минимальный мужчина работника заработная плата равна или больше максимальная заработная плата женщин-сотрудников?

Это упражнение, с которым мне трудно сломать голову. Я знаю, что будут предложения GROUP BY, но я действительно не понимаю, как они работают.

Ответы предпочтительны в синтаксисе MSSQL, если это вообще имеет значение.

ответ

1

Я не Mgmt Studio, чтобы проверить это, но я думаю, что это даст вам то, что вам нужно:

WITH cte AS (
SELECT 
    department, 
    min(case when sex = 'M' then salary else 10000000000) as MinMaleSalary, 
    max(case when sex = 'F' then salary else 0) as MaxFemaleSalary 
FROM 
    Employees 
GROUP BY department 
) 

SELECT * 
FROM cte 
WHERE MinMaleSalary >= MaxFemaleSalary; 

Если это не работает, вы можете использовать второй КТР, чтобы получить Min Мужчина и Max Female отдельно, прежде чем сравнивать их.

+0

Прохладный, я hadnt думал о запросе подмножество. Я вижу, что идея будет работать, но студия mgmt сообщает мне, что есть неправильный синтаксис в 'min (case [sex], когда« M »тогда [зарплата] еще 10000000000) в качестве [MinMaleSalary],' near ')' – chaixdev

+2

просто добавьте ' end' before ')' – Max

+0

Спасибо Макс! и Николай! – chaixdev

1

Следующее утверждение можно также использовать

select 
    a.*, b.minM 
from 
(
select 
    department, max(salary) maxF 
from employees 
where sex = 'F' 
group by department 
) A, 
(
select 
    department, min(salary) minM 
from employees 
where sex = 'M' 
group by department 
) B 
where a.Department = B.department and maxF <= minM 
Смежные вопросы