3

SQL Server 2005を使用しています。在庫/購入プログラムを構築していて、ユーザーが機器を「チェックアウト」する必要がある時点にいます。彼が商品を選択するとき、私はどの在庫場所に利用可能な数量があるかを照会し、どの場所に歩いて商品を取得するかをユーザーに伝える必要があります。

これは、特定の[ProductUsages].ProductUsageIDが割り当てられた特定の[StockLocation_Products].ProductIDのクエリです。

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)。

しかし、私が望むことを達成するために、HAVING SUM()でGROUPBYを使用する方法を本当に理解していません。

グループ内で/having句を使ってさまざまなことを試しましたが、結果が得られません。

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

合計が30になるStockSpacesの(少なくとも1つの)組み合わせを示す結果が必要なので、「スペース「6-C」から21ユニット、「6-B」から9ユニットを取得できます。sum()> = 30になる可能性のある行の組み合わせが複数ある可能性がありますが、少なくとも1つの組み合わせを見つける方法が必要です。ヘルプ!

4

2 に答える 2

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句の後にグループを追加できるようになります。

于 2010-01-18T19:48:06.023 に答える
0

あなたがやろうとしているのは、SQLのさまざまな手法で得られるランニングサムです。特にこれをすべて同じクエリで実行しようとしている場合、最も効率的なクエリはCTEを使用することだと思います(ここに1つの例があります)。

CTEに依存しない別の手法では、データを別のテーブル(ただし、一時テーブルの場合もあります)に入力する必要があり、基本的には、結合と並べ替えの操作を実行します。

ランニングサムを含むデータを取得したら、ランニングサムが検索しようとしている総数以下の値を選択するだけです。

そして、ここにいくつかの異なるテクニックの素晴らしい要約があります。

于 2010-01-18T19:48:45.947 に答える