SQL

Помогите написать sql запросы

В базе данных есть три таблицы: Product, Provider, Product_provider_link. Структура таблиц приведена ниже.
Таблица Product – сведения о продукции
Product_id Идентификатор продукта
Product_name Наименование продукта
Product_balance Остаток продукта (количество штук)

Таблица Provider – сведения о поставщиках
Provider_id Идентификатор поставщика
Provider_name Наименование поставщика
Provider_flag Признак действующего поставщика (1-действует, 0-не действует)

Таблица Product_provider_link – связь продукции и поставщиков
Id Идентификатор связи продукта и поставщика
Product_id Идентификатор продукта
Provider_id Идентификатор поставщика

3.1. Напишите SQL-запрос, показывающий топ 10 поставщиков по объёму предоставляемой продукции
3.2. Напишите SQL-запрос, показывающий продукты, которые поставляют более одного поставщика
3.3. Напишите SQL-запрос, показывающий заканчивающиеся продукты, остаток которых меньше 5, и их поставщиков
Если Oracle, то так:

3.1
 SELECT R.PROVIDER_ID, MIN(R.PROVIDER_NAME) AS PRODUCT_NAME,
SUM(P.PRODUCT_BALANCE) AS PRODUCT_VOLUME
FROM PRODUCT P, PROVIDER R, PRODUCT_PROVIDER_LINK L
WHERE P.PRODUCT_ID = L.PRODUCT_ID
AND R.PROVIDER_ID = L.PROVIDER_ID
GROUP BY R.PROVIDER_ID
ORDER BY P.PRODUCT_BALANCE DESC
LIMIT TO 10

3.2
 SELECT P.PRODUCT_ID, MIN(P.PRODUCT_NAME) AS PRODUCT_NAME
FROM PRODUCT P, PROVIDER R, PRODUCT_PROVIDER_LINK L
WHERE P.PRODUCT_ID = L.PRODUCT_ID
AND R.PROVIDER_ID = L.PROVIDER_ID
GROUP BY P.PRODUCT_ID
HAVING COUNT(R.PROVIDER_ID) > 1

3.3
 SELECT P.PRODUCT_ID, P.PRODUCT_NAME, R.PROVIDER_ID, R.PROVIDER_NAME
FROM PRODUCT P, PROVIDER R, PRODUCT_PROVIDER_LINK L
WHERE P.PRODUCT_ID = L.PRODUCT_ID
AND R.PROVIDER_ID = L.PROVIDER_ID
AND P.PRODUCT_BALANCE < 5
Серж Полях
Серж Полях
87 571
Лучший ответ
3.1 невозможно сделать с имеющимися данными. Мы ничего не знаем об объемах поставок.

 /*3.2*/SELECT P.Product_id, Product_name FROM Product_provider_link PPL INNER JOIN Product P ON PPL.Product_id=P.Product_id GROUP BY P.Product_id, P.Product_name  HAVING COUNT(DISTINCT PPL .Provider_id) >1;

/*3.3*/SELECT P.* FROM Product P INNER JOIN Product_provider_link PPL ON PPL.Product_id=P.Product_id INNER JOIN Provider PR ON PR.Provider_id = PPL.Provider_id WHERE P.Product_balance < 5;
AT
Askhat Tayeshev
71 404
Руслан Нурадилов Спасибо большое. Я вот и подзавис поэтому. Может имеется ввиду топ по количеству продуктов. Тогда же возможно сделать?
 3.1. 

SELECT p.Provider_name, SUM(pr.Product_balance) AS total_product_balance
FROM Provider p
JOIN Product_provider_link ppl ON ppl.Provider_id = p.Provider_id
JOIN Product pr ON pr.Product_id = ppl.Product_id
WHERE p.Provider_flag = 1
GROUP BY p.Provider_name
ORDER BY total_product_balance DESC
LIMIT 10;

3.2.

SELECT pr.Product_name, COUNT(DISTINCT ppl.Provider_id) AS total_providers
FROM Product pr
JOIN Product_provider_link ppl ON ppl.Product_id = pr.Product_id
GROUP BY pr.Product_name
HAVING COUNT(DISTINCT ppl.Provider_id) > 1;

3.3.

SELECT pr.Product_name, p.Provider_name, pr.Product_balance
FROM Product pr
JOIN Product_provider_link ppl ON ppl.Product_id = pr.Product_id
JOIN Provider p ON p.Provider_id = ppl.Provider_id
WHERE pr.Product_balance < 5;