#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:
Это действительно надуманное назначение… Вот один из вариантов:
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
предложению.