СУММА группового подсчета с использованием подзапросов - PullRequest
1 голос
/ 14 мая 2019

Используя базу данных 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, который я создал?

...