По условиям задачи, нам даны две таблицы:
таблица CLIENTS (клиенты), имеющая, среди прочих, столбцы:
ID_CLIENT NUMBER PRIMARY KEY,
NAME_CLIENT VARCHAR(100) NOT NULL;
и таблица INVOICES (счета клиентам) со столбцами:
ID_INVOICE NUMBER PRIMARY KEY,
ID_CLIENT NUMBER NOT NULL,
AMOUNT NUMBER NOT NULL.
В таблице INVOICES столбец ID_CLIENT определён как внешний ключ (foreign key), ссылающийся на таблицу CLIENTS на поле ID_CLIENT.
Необходимо вывести все столбцы из таблицы клиентов, а также дополнительными столбцами вывести "количество продаж для каждого клиента" и "ранг клиента". Чем больше счетов выставлено клиенту, тем более раннее место в ранжировании он должен занимать. У клиента или клиентов, имеющих наибольшее количество счетов, должен быть проставлен ранг 1.
Здесь нужно поставить чтение на паузу. Попробуй сначала решить задачу самостоятельно.
Ещё больше интересных задач найдёшь в нашем Телеграм-канале.
Итак, ниже рассмотрим решение задачи.
Так как в условиях задачи сказано, что из таблицы клиентов нужно вывести все (!) столбцы и дополнительно добавить ещё один столбец с количеством счетов, то не разумно, выводя клиентов, присоединять к ним счета для последующей группировки всех полученных данных по клиентам. В этом случае нам бы пришлось в группировке указывать все столбцы таблицы клиентов.
Выходит, что информацию о количестве выставленных счетов каждому клиенту лучше всего вывести подзапросом:
SELECT C.*,
(SELECT COUNT(*)
FROM INVOICES I
WHERE I.ID_CLIENT = C.ID_CLIENT) COUNT_INVOICES
FROM CLIENTS C
Получим:
Теперь осталось проранжировать полученные данные. Поставим ранг 1 клиенту с наибольшим количеством счетов. Воспользуемся аналитической (оконной) функцией DENSE_RANK(). Так как чем больше счетов имеет клиент, тем меньше должно быть значение ранга, выходит, что в функции ранжирования нужно применить обратную сортировку - то есть ORDER BY COUNT_INVOICES DESC.
Сделаем выборку из только что полученной таблицы данных. Выведем имеющиеся столбцы и добавим новый - Ранг клиента:
Ещё больше задач по SQL и базам данных с собеседований, а также разборов реальных практических ситуаций найдёшь в нашем Телеграм-канале.
Наш курс по SQL и базам данных здесь: prime-soft.biz/courses/sql