お世話になっております。Sql初心者でUpdate文の書き方で困っております。ご教授の程宜しくお願い致します。
下記のような2つのテーブルがあります。
関係はTotalが合計を表すテーブルでDetailが明細を表すテーブルです。OTとNoの組み合わせで一意となります。TotalテーブルのTotalAmountはDetailテーブルのAmountの合計です。
行いたいUpdateは『TotalAmountとTotalの合計が合わないもののみTotalAmountをOTとNoで紐ずくDetailテーブルのAmountの合計で更新する』です。
■テーブル名:Total
-------------------------------------------------------
列名) OT No TotalAmount
-------------------------------------------------------
20 100000 0
20 100001 0
20 100002 10
■テーブル名:Detail
-------------------------------------------------------
列名) OT No Amount
-------------------------------------------------------
20 100000 10
20 100000 10
20 100001 20
20 100001 30
20 100002 5
20 100002 5
■作成したSql
update Total set TotalAmount = (select Sum(Amount) from Detail
Inner Join Total on Detail.OT = Total.OT and Detail.No = Total.No
group by Total.TotalAmount,Total.OT,Detail.OT,Total.No,Detail.No
having Total.TotalAmount <> sum(Detail.Amount) )
where OT = (select OT from Detail) and No = (select No from Detail) and
TotalAmount <> (select sum(Amount) from Detail)
いろいろ試行錯誤しながら作成しましたが『サブクエリは複数の値を返しました ~ 』というエラーが出てしまいます。
つっこみどころ満載だと思いますがご教授の程宜しくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>この部分は何を行っているのでしょうか?
>>isnull(d.TotalAmount,0)
そもそもleft outer joinにしている理由は「Totalにはあるけど、(削除されたなどで)Detailにはないというケース」を想定してのものです。
Detailが万一なくなっていれば、やはりTotalAmountは0にしたいでしょうから。
上記のケースではDetail側はデータがないので、NULLになります。
ISNULLは「NULLならばゼロにする」という関数です。
これにより上記ケースでもTotalAmountを0にできます。
No.2
- 回答日時:
分かりやすく考えるには、一旦Detailを集計してからJOINした方がよいですね。
update Total
set TotalAmount=isnull(d.TotalAmount,0)
from Total t
left outer join
(select OT,No,sum(Amount) TotalAmount from Detail
group by OT,No) d ON d.OT=t.OT and d.No=t.No
where t.TotalAmount<>isnull(d.TotalAmount,0)
この回答への補足
なるほどです。ありがとうございます。
更新もきれいにできました。
1つ質問です。
この部分は何を行っているのでしょうか?
>isnull(d.TotalAmount,0)
宜しくお願いします。
No.1
- 回答日時:
そもそも1回のクエリーでTotalテーブル全行のTotalAmountを更新する事自体が無理な気がします。
set TotalAmount = (...) の部分のサブクエリーは where句が無いため group byしか結果の組み合わせ分(複数)の値が返ってくるので、どの値にアップデートしたらいいのか特定できなくてエラーになります。
※ サブクエリーだけ一回実行してみるとわかると思います。
まず、TotalテーブルからOTとNoとTotalAmountの各値を取得しておき
update Total set TotalAmount = (select Sum(Amount) from Detail where OT = [OTの値] and No = [Noの値]) where Detail where OT = [OTの値] and No = [OTの値] and TotalAmount <> (select Sum(Amount) from Detail where OT = [OTの値] and No = [Noの値]);
をぐるぐる回すのがいいのではないでしょうか。
ご指摘ありがとうございます。
特に↓部分なるほどです。
>set TotalAmount = (...) の部分のサブクエリーは where句が無いため group byしか結果の組み合わせ分(複数)の値が返ってくるので、どの値にアップデートしたらいいのか特定できなくてエラーになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- Access(アクセス) MAXで0が出力される 1 2022/03/31 21:43
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Excel(エクセル) Excelの数字(文字列)合計について あるデータをダウンロードすると、数字データが全て文字列になっ 4 2022/09/26 21:21
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- 英語 Results: In total, 5,963 titles were identified wi 4 2022/12/29 21:29
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
ビューで引数を使いたい
-
select into句のトランザクショ...
-
SQL 件数取得を速くしたい
-
SQLの書き方
-
DB2 業種毎に連番をつけたいの...
-
IFで条件を分岐させてのINSERT...
-
Access関数について クエリで空...
-
二つの表の項目を比較して値を...
-
SQLで○○の値以外を持っているレ...
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
オラクルではできるのにSQLSERV...
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
SELECT文でのデッドロックに対...
-
ACCESS2007 フォーム 「バリア...
-
クエリのキャンセルがいつにな...
-
データの二重表示の原因
-
数百万件レコードのdelete
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ビューで引数を使いたい
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
SQLで○○の値以外を持っているレ...
-
複数のテーブルから同じ条件で...
-
SQL 件数取得を速くしたい
-
Insert Into Select での重複に...
-
Access関数について クエリで空...
-
SQLの書き方
-
DB2 業種毎に連番をつけたいの...
-
select into句のトランザクショ...
-
2つのテーブルを結合して合計(...
-
条件が混在しているSQLで値取得
-
INSERT文でサブクエリ
-
アクセス(Access)のサブクエ...
-
SQL文を教えて下さい
-
Accessで在庫管理を
-
SQLについて質問です。 テーブ...
-
Sql文のUpdateと副問い合わせで...
-
アクセス
おすすめ情報