SQL СУММА ГРУППЫ ПО - PullRequest
       28

SQL СУММА ГРУППЫ ПО

2 голосов
/ 18 января 2010

Использование SQL Server 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 (ов) вам нужно посетить, чтобы удовлетворить запрос для некоторого Qty. Например. Пользователь должен вытащить 30 продукта (ID = 4).

Но я не совсем понимаю, как использовать GROUP BY с HAVING SUM () для достижения того, чего я хочу.

Я пробовал разные вещи в своей группе с помощью / с предложением, но я просто не получил никаких результатов.

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, но мне нужно хотя бы как найти одну комбинацию, которая делает! Помогите!

Ответы [ 2 ]

2 голосов
/ 18 января 2010

Вы можете иметь внутренний выбор, например:

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.

0 голосов
/ 18 января 2010

То, что вы пытаетесь сделать, это текущая сумма, которую вы можете получить с помощью различных методов в SQL. Я думаю, что наиболее эффективный запрос, особенно если вы пытаетесь сделать все это в одном запросе, это использовать CTE (, вот один пример ).

Другой метод , который не зависит от CTE, требует, чтобы данные были помещены в другую таблицу (хотя это может быть временная таблица), и в основном вы выполняете объединение и сортировка по ходу работы.

Как только вы получите данные для включения промежуточной суммы, вы можете просто выбрать значения, из которых промежуточная сумма меньше или равна общему числу, которое вы пытаетесь найти.

И здесь - хорошее резюме нескольких различных техник.

...