733 подписчика

Небольшая SQL задача с подзапросом и аналитикой

657 прочитали
По условиям задачи, нам даны две таблицы:  таблица CLIENTS (клиенты), имеющая, среди прочих, столбцы:
ID_CLIENT  NUMBER  PRIMARY KEY,
NAME_CLIENT  VARCHAR(100) NOT NULL; 

и таблица INVOICES (счета...

По условиям задачи, нам даны две таблицы:

таблица 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

Получим:

По условиям задачи, нам даны две таблицы:  таблица CLIENTS (клиенты), имеющая, среди прочих, столбцы:
ID_CLIENT  NUMBER  PRIMARY KEY,
NAME_CLIENT  VARCHAR(100) NOT NULL; 

и таблица INVOICES (счета...-2

Теперь осталось проранжировать полученные данные. Поставим ранг 1 клиенту с наибольшим количеством счетов. Воспользуемся аналитической (оконной) функцией DENSE_RANK(). Так как чем больше счетов имеет клиент, тем меньше должно быть значение ранга, выходит, что в функции ранжирования нужно применить обратную сортировку - то есть ORDER BY COUNT_INVOICES DESC.

Сделаем выборку из только что полученной таблицы данных. Выведем имеющиеся столбцы и добавим новый - Ранг клиента:

По условиям задачи, нам даны две таблицы:  таблица CLIENTS (клиенты), имеющая, среди прочих, столбцы:
ID_CLIENT  NUMBER  PRIMARY KEY,
NAME_CLIENT  VARCHAR(100) NOT NULL; 

и таблица INVOICES (счета...-3

Ещё больше задач по SQL и базам данных с собеседований, а также разборов реальных практических ситуаций найдёшь в нашем Телеграм-канале.

Наш курс по SQL и базам данных здесь: prime-soft.biz/courses/sql