СОЕДИНЕНИЯ И ПОДЗАПРОСЫ

#sql #oracle #oracle-sqldeveloper

#sql #Oracle #oracle-sqldeveloper

Вопрос:

Вопрос — Отобразить идентификатор клиента, имя и общее количество заказов для заказов, обрабатываемых продавцом Маршаллом, но только если имя клиента начинается на General или заканчивается на Electric. Исключите клиентов, которые разместили один заказ, но также включите клиентов без заказов. Отсортируйте результат на основе общего количества заказов по убыванию, а затем по возрастанию имени. Не используйте оператор LIKE и не объединяйте 3 таблицы.

Вывод вопросов

Вывод вопроса

Текущий запрос

 SELECT c.customer_id, 
       c.name, 
       Count(o.order_id) "# of Orders" 
FROM   customers c 
       left join orders o 
              ON c.customer_id = o.customer_id 
WHERE  Substr(c.name, 1, 7) = 'General' 
        OR Substr(c.name, -8) = 'Electric' 
           AND o.order_id IN (SELECT o.order_id
                              FROM   orders o, 
                                     order_items oi 
                              WHERE  o.order_id = oi.order_id 
                                     AND o.salesman_id = (SELECT employee_id 
                                                           FROM   employees 
                                                           WHERE 
                                         last_name = 'Marshall') 
                              GROUP  BY o.order_id 
                              HAVING Count(customer_id) > 1) 
GROUP  BY c.customer_id, 
          c.name; 
  

Текущий вывод

База данных —

База данных 1/2
База данных 2/2

Не уверен, что я здесь делаю не так.

Ответ №1:

Это действительно надуманное назначение… Вот один из вариантов:

 select c.customer_id, c.customer_name, count(o.orderid) cnt
from customers c
left join orders o 
    on  o.customer_id = c.customer_id
    and (select last_name from employee e where e.employee_id = o.salesman_id) = 'Marshall'
where substr(c.name, 1, 7) = 'General' or substr(c.name, -8) = 'Electric'
group by c.customer_id, c.customer_name
having count(o.orderid) <> 1
  

Основная идея заключается в left join . where Предложение фильтрует по имени клиента — без like : у вас это уже было.

Для фильтрации по имени продавца без дополнительного объединения мы используем коррелированный подзапрос в on предложении left join . Здесь нет необходимости ни приводить order_items , ни выбирать снова orders .

Наконец, фильтрация по количеству заказов переходит к having предложению.