В этой таблице, которая показывает сотрудников в компании: создать таблицу сотрудников (id int первичный ключ, позиция varchar не null, salary int не null); Примечание: сотрудников увеличилось ...

sql
0
user15220354 16 Фев 2021 в 15:25

2 ответа

Лучший ответ

Вот решение вашего запроса. Есть несколько способов получить требуемые результаты.

SELECT count(*) as 'Seniors' FROM (SELECT id, position, salary, (SELECT SUM(salary) from employees WHERE id < e1.id) as total FROM employees e1)
WHERE total <= 50000 AND position = 'senior';
SELECT COUNT(*) AS 'Juniors' FROM (SELECT id, position, salary, (SELECT SUM(salary) FROM employees WHERE id < e1.id) as total FROM employees e1)
WHERE total <= (50000 - (SELECT SUM(salary) from (SELECT id, position, salary, (SELECT SUM(salary) FROM employees WHERE id < e2.id) as total FROM employees e2)
                        WHERE total <= 50000 AND position = 'senior')) AND position = 'junior';

Вы также можете использовать процедуру, но я предпочитаю, чтобы этот запрос упростил вам запуск вместо функций и процедур.

2
Mohamed Bdr 16 Фев 2021 в 12:33

Вы можете сделать это с помощью одного запроса. Это немного сложно, но на самом деле логика довольно проста:

  • Рассчитайте текущую зарплату пожилых людей, от минимальной до максимальной.
  • Выберите всех пожилых людей меньше пороговой суммы.
  • Рассчитайте текущую зарплату для юниоров, от самой низкой до самой высокой.
  • Выбирайте всех юниоров меньше оставшейся суммы.
  • Объедините две группы.

В SQL это выглядит так:

with seniors as (
      select e.*
      from (select e.*,
                   sum(salary) over (order by salary) as running_salary
            from employees e
            where position = 'senior'
           ) e
      where running_salary <= @amount
     ),
     juniors as (
      select e.*
      from (select e.*,
                   sum(salary) over (order by salary) as running_salary
            from employees e
            where position = 'junior'
           ) e cross join
           (select max(running_salary) as senior_salaries from seniors) s
      where running_salary <= (@amount - s.senior_salaries)
    )
select s.*
from seniors s
union all
select j.*
from juniors j;
1
Gordon Linoff 16 Фев 2021 в 12:31
66224288