プロが教えるわが家の防犯対策術!

SQL文の書き方を教えてください。
データベースの構造を簡略して説明しますと、商品テーブルに商品コードと状態の項目があり、売上テーブルに売上番号と商品コードと売上数量の項目があります。
商品テーブル
商品コード 状態
001    空白
002    空白

売上テーブル
売上番号 商品コード 売上数量
1     001    10
2     001    20

売上テーブルの売上レコードの件数を商品コード別にカウントし、レコード件数がゼロだったら”未”、ゼロ以外だったら”売”という値を商品テーブルの状態にセットしたいのですが、どのようなSQL文を書けばいいのでしょうか。
上のような場合に期待される結果は次の通りです。

商品テーブル
商品コード 状態
001    売
002    未

商品コード001はレコード件数が2件なので”売”、商品コード002はレコードがないので”未”。
初歩的な質問ですが、教えてください。

質問者からの補足コメント

  • where 0 then の部分が、データがないと条件に該当しないようで、全て'売'になってしまいました。
    データがない場合の判定をするか、データがある場合の判定をするかどちらか正しく判定をするにはどのようにすればいいのでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/09/16 05:26
  • ありがとうございます。
    その情報を使って次のアクションをかけるので、やはり更新しないといけない状態です。

    No.7の回答に寄せられた補足コメントです。 補足日時:2016/09/17 09:57

A 回答 (7件)

UPDATE JOINで更新するといいですよ。


①商品テーブルと売上テーブルでLEFT JOINします。
②商品テーブルにあって、売上テーブルに存在しないデータは、売上数量がnullになるので、
 売上数量がnullの場合は未、それ以外は済ですかね。
 ※数量合計が0の場合はとか考える必要があるなら、売上テーブルをサブクエリ(GroupBY+sum)にして、null or 0 は未、それ以外は済とかでよいかな。

--サンプル
declare @商品 table(商品コード char(3),状態 nvarchar(1))
declare @売上 table(売上番号 int,商品コード char(3),売上数量 int)

insert @商品 values('001',''),('002','')
insert @売上 values(1,'001',10),(2,'001',20)

update @商品 set 状態 = case when 売上数量 is null then '未' else '売' end
--以下のFrom句ではテーブル変数を使っていますので、テーブル名をリネームしていますが、実テーブルの場合はリネーム不要です。
from @商品 as 商品 left join @売上 as 売上
ON 商品.商品コード = 売上.商品コード

select * from @商品
--結果
--商品コード 状態
--001    売
--002    未
    • good
    • 0
この回答へのお礼

ありがとうございました。
データの更新もちゃんとできるようになりました。

お礼日時:2016/09/17 09:59

Updateしないとだめですか?


Selectを工夫するとか、ビューとか、そんなので一々書き換える必要もなく、常に最新状態にできますが。
パフォーマンスとかの検討は必要ですけど
この回答への補足あり
    • good
    • 0

あ、売上テーブルが変更された場合(売上レコードの削除)も考慮しています。


済が未戻るケースもありますよね?その場合デフォルトでは対応できないんですよね。
なので当初の質問そのままの回答にしています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
まさにその通りで、このデータは削除されることが想定され、その時の対応が重要になっていました。
UPDATE JOINで試してみます。

お礼日時:2016/09/17 01:49

ANo.1です。


データがあるものだけを対象としたいならば、updateの条件としてexists()で、売上データに存在するものだけを対象とすれば済む話です。
また、1レコード単位に毎度毎度売上データを集計するクエリなので、例え一発SQLで出来たとしてもパフォーマンスが高いかと言われたらそうではありません。

が、そもそもそういう状況も存在するということでやりたいことを考えたら、ANo.3の回答がベストプラクティスでしょう。
    • good
    • 0

>何とか一つのSQL文で



そもそもが商品テーブルに新規にレコードを追加するときに状態を「未」に
すれば済む話なので、デフォルトで処理するなり、レコード追加する際に「未」を
スタティックにしていするなりすればよい話です。

すでに登録しているデータを1度だけ更新するだけであれば
UPDATE テーブル SET 状態='未' WHERE 状態=''
として、あとはデフォルト値にまかせるのが賢明です
    • good
    • 0

まぁ考え方しだいですが空白を一度すべて未にupdateしてから


レコードを元に存在すれば売にすればよいでしょう
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かに現実的には可能だと思いますが、何とか一つのSQL文でできないものなんでしょうか?

お礼日時:2016/09/16 15:19

uptate


商品テーブル a
set
a.状態=(select case count(*) when 0 then '未' else '売' end from 売上テーブル b where b.商品コード=a.商品コード)

みたいな
動作未確認です
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す