Тема: агрегаты, подзапросы, фильтрация без оконных функци
📌 Задача:
Дана таблица
EMPLOYEES:
CREATE TABLE EMPLOYEES (
ID NUMBER,
DEPT VARCHAR2(50),
SALARY NUMBER
);
Пример данных:
| ID | DEPT | SALARY |
|----|----------|--------|
| 1 | HR | 4000 |
| 2 | HR | 3000 |
| 3 | IT | 5000 |
| 4 | IT | 5000 |
| 5 | Finance | 6000 |
| 6 | Finance | 5500 |🧩 Найти:
Выведите отделы, где ЗП всех сотрудников одинаковая, и эту ЗП.
🎯 Подвох:
- многие начинают с
GROUP BY DEPT, но обычный AVG или SUM не помогут- нужно найти отделы, где MIN(SALARY) = MAX(SALARY), но не забыть, что отдел может содержать одного сотрудника (это корректно)
✅ Ожидаемый результат:
| DEPT | SALARY |
|---------|--------|
| IT | 5000 |🔍 Решение:
```sql
SELECT DEPT, MIN(SALARY) AS SALARY
FROM EMPLOYEES
GROUP BY DEPT
HAVING MIN(SALARY) = MAX(SALARY);
```
📌 **Пояснение подвоха:**
- `HAVING MIN = MAX` — проверяет, что все значения в группе одинаковые
- Не нужно подзапросов и оконных функций — решение минималистично и эффективно
- Часто используется для поиска «однородных» групп
🧪 Попробуй модифицировать запрос:
• Вывести только те отделы, где **больше одного сотрудника** и ЗП одинаковая
• Или отделы, где все сотрудники получают **разную** ЗП
👍 Лайк, если хотите задачу сложнее
➡ SQL Community