1

SQL Server 2005 Express を使用するプログラムがあり、在庫を計算するために 2 つのテーブルをループ処理する必要があります。

  • Table 1: セットアップ時にすべての製品を在庫合計とともに保存します
  • Table 2: テーブル 1 のすべての製品に対するトランザクションを格納します

テーブル 2 のすべてのアイテムをループして、テーブル 1 のカウントからその金額を差し引くにはどうすればよいですか?

このようなクエリがある場合、各製品のデータを取得します

SELECT 
     ii.ItemNum, ii.ItemName, ii.OzOnHand
FROM 
     dbo.InventoryItems ii
INNER JOIN 
     dbo.InventoryLog il ON ii.ItemNum = il.InvItemNum
WHERE 
     ii.active = 1

テーブル 2 の各オカレンスをテーブル 1 の合計金額から差し引く必要があります

4

1 に答える 1

4

これは、集計されたテーブルへの結合の例です (それを理解するための最良の方法だと思います)。

SELECT ii.ItemNum, ii.ItemName, ii.OzOnHand, ii.OzOnHand - coalesce(il.cnt, 0)
FROM dbo.InventoryItems ii LEFT JOIN
     (select il.InvItemNum, sum(OzRemoved) as cnt
      from dbo.InventoryLog il
      group by il.InvItemNum
     ) il
     ON ii.ItemNum = il.InvItemNum
WHERE ii.active = 1;

サブクエリは、ログ内のすべてをグループ化し、エントリの数をカウントします。各エントリが複数のアイテムに影響を与える可能性がある場合は、sum(cnt) as cnt代わりに のようなものを使用しますcount(*)

次に、クエリはleft outer join. このタイプの結合により、ログに何もないものも含め、すべてのインベントリ アイテムが確実に残ります。最後に、セットアップで利用可能なものからカウントが差し引かれます。これcoalesce()は、ログ テーブルに一致するものがない状況を処理するためのものです。の取得を避けるためにNULLNULLは に変換されます0

于 2013-07-29T20:39:40.520 に答える