Pergunta

Usando o SQL Server 2005. Estou construindo um programa de inventário/compra e estou no ponto em que preciso que o usuário "confira" o equipamento. Quando ele seleciona um produto, preciso consultar quais locais de estoque têm a Qtdia disponível e informar ao usuário qual local caminhar/ recuperar o produto.

Aqui está uma consulta para um [StockLocation_Products] específico .ProductId, com um [ProductUsages] .ProductusageId atribuído específico.

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

Esta consulta retorna:

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

Eu pensei que talvez eu pudesse usar uma cláusula adicional para fazer com que este retorno de consulta qual combinação de estoque (s) você precisaria visitar para satisfazer uma solicitação de algum Qty. Por exemplo, o usuário precisa puxar 30 do produto (id = 4).

Mas eu realmente não entendo como usar o Grupo por ter sum (), para alcançar o que eu quero.

Eu tentei várias coisas no meu grupo / tendo cláusula, mas simplesmente não recebo nenhum resultado.

GROUP BY PROD.ProductID,PROD.ProductName,SL.Room,SL.StockSpace,SLPPU.ResvQty,PUSG.ProductUsage
HAVING SUM(ResvQty) >= 30;

Quero resultados que mostrem (pelo menos um) combinação de espaços de ações que resumem até 30, para que eu possa dizer ao usuário “Você pode obter 21 unidades do espaço '6-C' e 9 unidades de '6-B'. Pode haver várias combinações de linhas que poderiam somente ()> = 30, mas preciso pelo menos como encontrar uma combinação que o faça! Ajuda!

Foi útil?

Solução

O que você está tentando fazer é uma soma em execução, que você pode obter com várias técnicas no SQL. Eu acho que a consulta mais eficiente, especialmente se você estiver tentando fazer tudo isso na mesma consulta, é usar um CTE (Aqui está um exemplo).

Outra técnica Isso não depende do CTE exige que os dados sejam preenchidos em outra tabela (no entanto, pode ser uma tabela temporária) e, basicamente, você faz uma operação de união e derrota à medida que avança.

Depois de obter os dados para incluir uma soma em execução, você pode simplesmente selecionar os valores dos quais a soma em execução é menor ou igual ao número total que você está tentando localizar.

E aqui é um bom resumo de várias das diferentes técnicas.

Outras dicas

Você pode ter uma seleção interna, como:

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.

Isso lhe dará a capacidade de adicionar mais grupo após a cláusula de ter.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top