SQL com grupo de soma por
-
21-09-2019 - |
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!
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.