Хобрук: Ваш путь к мастерству в программировании

Получите сотрудников, у которых зарплата меньше, чем у тех, кто продал больше одного заказа

Извините за длинное название, но я хотел объяснить ситуацию.

Мои мозги почти взрываются. Я пробовал это уже пять часов, и я не понимаю. Просто сильно разболелась голова.

Я хочу получить тех сотрудников, у которых зарплата меньше, чем у любого из тех, кто продал один или несколько заказов. Есть две таблицы EMPLOYEES и ORDERS.

EMPLOYEES есть эти столбцы; Имя, Фамилия, Номер социального страхования, Зарплата.

ORDERS есть эти столбцы; Номер социального страхования, OrderID

Это лучшее решение на данный момент.

SELECT H.SOCSECNUM, H.LASTNAME, H.FIRSTNAME, H.SALARY
FROM EMPLOYEES H
WHERE H.SALARY < ALL(SELECT COUNT(T.ORDERID)
                     FROM ORDERS T
                     WHERE  H.SOCSECNUM = T.SOCSECNUM
                     HAVING COUNT(T.ORDERID) > 0
                     );

Я понимаю это как получить номер социального страхования, имя и зарплату всех сотрудников, у которых зарплата меньше, чем у тех, кто продал более 0 заказов.

Я тупой или что в этом плохого? Теперь это печатает всех сотрудников, у которых нет заказов. Если я изменяю 0 -> 1, он печатает всех сотрудников, у которых есть один или меньше заказов.

31.03.2020

  • Мне кажется, вы сравниваете зарплату с количеством идентификаторов заказов. 31.03.2020
  • Пожалуйста, отметьте свой вопрос с помощью базы данных, которую вы используете. 31.03.2020
  • В таблице заказов будут только те ssn, которые сделали заказ? 31.03.2020

Ответы:


1

Я думаю, что это запрос, который вы хотели написать:

select e.*
from employees e
where h.salary < all (
    select h1.salary
    from employees e1
    where exists (select 1 from orders o1 where o1.socsecnum = e1.socsecnum)
)

Подзапрос возвращает список зарплат сотрудников, совершивших хотя бы одну продажу. Затем вы можете использовать all для фильтрации таблицы по этому параметру.

Вы также можете использовать агрегацию:

select e.*
from employees e
where h.salary < (
    select min(h1.salary)
    from employees e1
    where exists (select 1 from orders o1 where o1.socsecnum = e1.socsecnum)
)
31.03.2020

2

Вам нужно количество заказов и зарплата для сотрудников. Это полезно в одном ряду. Итак, используйте JOIN:

select e.*, numorders
from employees e left join
     (select o.socseqnum, count(*) as numorders
      from orders o
      group by o.socseqnum
     ) o
     on e.socseqnum = o.socseqnum;

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

select eo.*
from (select e.*, o.numorders,
             min(case when numorders = 1 then e.salary end) over () as min_salary_1order
      from employees e left join
           (select o.socseqnum, count(*) as numorders
            from orders o
            group by o.socseqnum
           ) o
           on e.socseqnum = o.socseqnum
     ) eo
where salary < min_salary_1order
31.03.2020

3

Использование uncorrelated subquery

select *
from employees 
where salary < (select min(salary) 
                from employees 
                where socsecnum in (select socsecnum  
                                    from orders 
                                    where socsecnum  is not null));
31.03.2020
Новые материалы

Понимание дженериков в TypeScript: подробное руководство
Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..