使用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组合以满足某些数量的请求。例如。用户需要提取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个,所以我可以告诉用户“你可以从太空'6-C'获得21个单位,从'6-B'获得9个单位”。可能有多个行的组合可以sum()> = 30,但我至少需要如何找到一个组合!救命啊!
答案 0 :(得分:2)
您可以进行内部选择,例如:
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子句之后添加更多组。
答案 1 :(得分:0)
你要做的是一个运行总和,你可以用SQL中的各种技术获得。我认为最有效的查询,特别是如果您尝试在同一查询中执行此操作,则使用CTE( here's one example )。
不依赖于CTE的Another technique 需要将数据填充到另一个表中(尽管可能是临时表),基本上你做了一个连接和排序随时随地进行操作。
一旦获得数据以包含运行总和,您就可以简单地选择运行总和小于或等于您尝试定位的总数的值。
here 是几种不同技术的精彩摘要。