Вопрос

Использование 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top