SQL, ИМЕЮЩИЙ СУММУ ГРУППУ ПО
-
21-09-2019 - |
Вопрос
Использование SQL-сервера 2005.Я создаю программу инвентаризации/закупок и нахожусь на этапе, когда мне нужно, чтобы пользователь «проверил» оборудование.Когда он выбирает продукт, мне нужно запросить, на каких складах имеется доступное количество, и сообщить пользователю, к какому месту идти/забрать продукт.
Вот запрос для конкретного [StockLocation_Products].ProductID с определенным назначенным [ProductUsages].ProductUsageID.
SELECT
PROD.ProductID,
PROD.ProductName,
SL.Room,
SL.StockSpace,
SLPPU.ResvQty,
PRDUSG.ProductUsage
FROM [StockLocations] SL
INNER JOIN [StockLocation_Products] SLP ON SL.StockLocationID = SLP.StockLocationID
INNER JOIN [StockLocation_Product_ProductUsages] SLPPU ON SLP.StockLocationID = SLPPU.StockLocationID AND SLP.ProductID = SLPPU.ProductID
INNER JOIN [ProductUsages] PUSG ON SLPPU.ProductUsageID = PRDUSG.ProductUsageID
INNER JOIN [Products] PROD ON SLPPU.ProductID = PROD.ProductID
WHERE SLP.ProductID = 4 AND PRDUSG.ProductUsageID = 1
Этот запрос возвращает:
ProductID ProductName Room StockSpace ResvQty ProductUsage
------------------------------------------------------------------------------------------------------------------------
4 Addonics Pocket DVD+/-R/RW B700 5-D 12 MC Pool
4 Addonics Pocket DVD+/-R/RW B700 6-B 10 MC Pool
4 Addonics Pocket DVD+/-R/RW B700 6-C 21 MC Pool
4 Addonics Pocket DVD+/-R/RW B700 6-D 20 MC Pool
Я подумал, что, возможно, я мог бы использовать дополнительное предложение HAVING, чтобы этот запрос возвращал, какую комбинацию StockSpace вам нужно посетить, чтобы удовлетворить запрос на определенное количество.Например.Пользователю необходимо получить 30 продуктов (ID = 4).
Но я не совсем понимаю, как использовать GROUP BY с HAVING SUM(), чтобы добиться того, чего я хочу.
Я пробовал разные вещи в своей группе с помощью предложения /having, но так и не получил никаких результатов.
GROUP BY PROD.ProductID,PROD.ProductName,SL.Room,SL.StockSpace,SLPPU.ResvQty,PUSG.ProductUsage
HAVING SUM(ResvQty) >= 30;
Мне нужны результаты, показывающие (хотя бы одну) комбинацию StockSpaces, сумма которой равна 30, чтобы я мог сказать пользователю: «Вы можете получить 21 единицу из пространства «6-C» и 9 единиц из пространства «6-B».Может быть несколько комбинаций строк, которые могут sum() >= 30, но мне нужно хотя бы найти одну такую комбинацию!Помощь!
Решение
Вы пытаетесь получить текущую сумму, которую можно получить с помощью различных методов SQL.Я думаю, что наиболее эффективный запрос, особенно если вы пытаетесь сделать все это в одном запросе, — это использовать CTE (вот один пример).
Другая техника это не зависит от CTE, требует, чтобы данные были заполнены в другую таблицу (хотя это может быть временная таблица), и по сути вы выполняете операцию соединения и сортировки по ходу дела.
Как только вы получите данные, включающие промежуточную сумму, вы можете просто выбрать значения, из которых текущая сумма меньше или равна общему числу, которое вы пытаетесь найти.
И здесь представляет собой хорошее резюме нескольких различных методов.
Другие советы
У вас может быть внутренний выбор, например:
SELECT count_of_foo, count(bar), baz
FROM (SELECT count(foo) as count_of_foo, bar, baz, other1, other2 FROM complex_query WHERE foo = bar HAVING count(foo) > 1) inner_query
GROUP BY count_of_foo, baz.
Это даст вам возможность добавить больше групп после предложения HAVING.