• 締切済み

こんなクエリーを作れますか

mySQL+PHPを使い、社内の支店間で不良在庫を融通するシステムを考えています。 (注)実際には、商品名や支店名に対してマスターテーブルを使いコード化するのでしょうが、    説明のため簡略化しています。また項目名も説明のため日本語にしています。 不良在庫テーブル(dt_stock) 項目名: 在庫コード、商品名、在庫数量、在庫支店名       ※在庫コードは自動発番 各支店が不良在庫の商品名と数量を入力します。 発注テーブル(dt_order) 項目名:発注コード、商品名、発注数量、発注支店名、在庫支店名      ※発注コードは自動発番 各支店が、他支店の不良在庫合計を検索し、そこから支店で必要な商品を発注します。 処理手順 各支店は、個々の在庫を知る必要はなく、商品別の在庫合計を見て必要な発注数量を決めます。 そして、別のプログラムで、発注の合計を各支店の在庫数量に自動分配します。 分配が終われば、発注分だけ在庫を減らし、発注データは既発注としてテーブルから削除されます。 問題点 当初は、dt_stockから商品ごとの在庫合計を表示するクエリー       dt_orderから商品ごとの発注合計を表示するクエリー をそれぞれ作成し、 これらのクエリを結合して、商品ごとの在庫と発注の合計をリストにするクエリーを作成しました。 (当然のことながら、各支店の在庫と発注の合計を表示するクエリーなので、当然、在庫支店や発注支店の情報は含まれていません) しかし、よく考えると、ある支店で不良在庫として計上している商品に対しては、発注をかけることはありえないので、誤って発注を掛けられないように、商品ごとの在庫と発注の合計をリストにするクエリーで、自分の支店の在庫が入力されている商品のデータを除外するようにはできないでしょうか。 私は、mySQLを使うのは初めてですが、ACCESSの経験はあります。「パラメータクエリーを使えば出来るのかな」とも思いますが、外しているかもしれません。 なんとかヒントだけでもいただければありがたいです。

みんなの回答

回答No.1

「全デットストック」と「自支店のみのデットストック」の2つのテーブルを、商品コードでLEFT JOIN(全デットストックの全件と、自支店のデットストックの一致レコードを結合)させます。 そして、WHERE条件で「自支店のデットストックの商品コードがNULLのレコード」だけを抽出します。 すると「自支店でデットストックのテーブルにある商品だけ、結果から取り除かれる」ので、目的を達成できます。 なお「各発注を、どの支店に対して行うか?」を良く考えないと、保管コスト、輸送費コストが嵩みます。 例えば 在庫店 商品 個数 A店    ア    4 B店    ア    6 A店    イ    2 B店    イ    3 と言う場合に、C店が「アを5個、イを2個」発注した場合には 在庫店 商品 個数 移動 在庫 A店    ア    4 B店    ア    6  5  1 A店    イ    2 B店    イ    3  2  1 と言う按分をしないといけないでしょう。こうすれば「B店からC店への発送のみ」で済みます。もし、 在庫店 商品 個数 移動 在庫 A店    ア    4  4  0 B店    ア    6  1  5 A店    イ    2  2  0 B店    イ    3 と按分すると、A店とB店の両方からC店に向けて発送を行う必要が出て、輸送コストが2倍になります。