Используя базу данных Adventureworks, нас просят перечислить поставщиков, чьи продукты были проданы в количестве более 15 за продажу, используя ТОЛЬКО подзапросы, без JOINS.
Пример.В SaleOrderID 43692 клиент купил 34 продукта в общей сложности, 10 из них были изначально приобретены у G & K, а 24 - у Integrated Sport, поэтому Integrated Sport составил бы список
SalesOrderID | OrderQty | ProductID | BusinessEntityID | Name
43692 | 3 | 708 | 1520 | G & K Bicycle Corp.
43692 | 3 | 711 | 1520 | G & K Bicycle Corp.
43692 | 4 | 707 | 1520 | G & K Bicycle Corp.
43692 | 4 | 716 | 1636 | Integrated Sport Products
43692 | 4 | 714 | 1636 | Integrated Sport Products
43692 | 6 | 712 | 1636 | Integrated Sport Products
43692 | 10 | 715 | 1636 | Integrated Sport Products
. Я проверил, смогу ли я создатьэтот ответ, но он только частично правильный, потому что он использует JOINS (вставка, между таблицами все еще считается JOIN)
SELECT V.Name
FROM Purchasing.Vendor AS V
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesOrderDetail AS S, Purchasing.ProductVendor AS P
WHERE S.ProductID = P.ProductID
GROUP BY S.SalesOrderID, P.BusinessEntityID
HAVING SUM(S.OrderQty) > 15)
ORDER BY V.Name;
, который возвращает следующий вывод:
Chicago City Saddles
Crowley Sport
First Rate Bicycles
Fitness Association
G & K Bicycle Corp.
Green Lake Bike Company
Greenwood Athletic Company
Integrated Sport Products
International Trek Center
Jeff's Sporting Goods
Superior Bicycles
Team Athletic Co.
КогдаЯ пытаюсь превратить JOIN в подзапрос, я не могу заставить HAVING SUM работать правильно, так как предполагается, что SUM находится внутри отдельных ячеек, а не сумма всех продуктов в заказе клиента, которые были приобретены у поставщика.
SELECT DISTINCT V.Name
FROM Purchasing.Vendor AS V
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM Purchasing.ProductVendor
WHERE EXISTS (
SELECT S.SalesOrderID, SUM(S.OrderQty) AS SumOrderQty, --S.ProductID,
(SELECT TOP 1 BusinessEntityID
FROM Purchasing.ProductVendor AS P
WHERE S.ProductID = P.ProductID) AS BusinessEntityID
FROM Sales.SalesOrderDetail AS S
GROUP BY S.SalesOrderID, S.ProductID
HAVING SUM(S.OrderQty) > 15))
Без секции HAVING SUM внутренняя часть возвращает все значения, как и ожидалось.при добавлении HAVING SUM () он возвращает только те продукты, которые были приобретены в количестве, превышающем 15, и вообще не учитывает поставщика.
Я подозреваю, что это потому, что он сгруппирован по S.ProductIDно я не могу удалить это, или я получаю ошибку.Есть ли способ игнорировать тот факт, что он сгруппирован, и вместо этого сгруппировать его по BusienssEntityID, который я создал?