SUM GROUP BYを持つSQL
-
21-09-2019 - |
質問
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() で GROUP BY を使用する方法がよくわかりません。
グループ by/having 句でさまざまなことを試しましたが、結果が得られません。
GROUP BY PROD.ProductID,PROD.ProductName,SL.Room,SL.StockSpace,SLPPU.ResvQty,PUSG.ProductUsage
HAVING SUM(ResvQty) >= 30;
合計が 30 になる StockSpace の (少なくとも 1 つの) 組み合わせを示す結果が必要なので、ユーザーに「スペース「6-C」からは 21 ユニット、「6-B」からは 9 ユニットを取得できます。sum() >= 30 になる可能性のある行の組み合わせは複数あるかもしれませんが、少なくともそのような組み合わせを 1 つ見つける方法が必要です。ヘルプ!
解決
ここでやろうとしているのは累計であり、SQL のさまざまな手法を使用して取得できます。特にこれをすべて同じクエリ内で実行しようとしている場合、最も効率的なクエリは CTE を使用することだと思います (ここに一例を示します).
別のテクニック CTE に依存しない場合は、データを別のテーブル (一時テーブルの可能性もあります) に移入する必要があり、基本的には結合と並べ替え操作を実行しながら実行します。
累計を含むデータを取得したら、累計が検索対象の合計値以下となる値を選択するだけです。
そして ここ は、さまざまなテクニックのいくつかをわかりやすくまとめたものです。
他のヒント
あなたのような、内側の選択を持つことができます
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句の後でより多くのグループを追加する機能を提供します。