質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

627閲覧

Accessクエリ 複数条件の更新クエリ

GoogleWindows

総合スコア23

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/06/10 11:34

続けてのご質問、失礼いたします。
更新したいテーブルは以下のような構造になっています。

テーブル名:出荷関連受注データ

受注番号 商品ID  価格    個数  支払ID
11111  E1513  ¥2,500 4 2
22222  E1513  ¥2,500 2 2
22222  K1158  ¥1,120 6 2
33333  E1513  ¥2,500 3 2
44444  E1513  ¥2,500 5 2
55555  E1513  ¥2,500 2 2
55555  K1158  ¥1,120 2 2
55555  P5310  ¥4,250 1 2

受注番号単位で商品の価格と個数をそれぞれ合計し、
¥10,000未満であれば、支払IDを3に、
それ以上であれば、支払IDを4にする更新クエリ(SQL)を作成したいと思っています。

例のごとく更新のため集計クエリが使えないので、
DSUMで1万円未満と以上を別の更新クエリにし、以下のようなSQLをVBAで走らせてみましたが、
個数をどこに挟み込めばいいのか分からない上、そもそもこの路線で合っているのかすら怪しいです。

VBA

1  ’¥10,000未満だった場合 2 strSQL = "UPDATE 出荷関連受注データ" _ 3 & " SET 出荷関連受注データ.支払ID = 3" _ 4 & " WHERE (((DSum('価格','出荷関連受注データ','受注番号=' & [受注番号])<10000));" 5 6 Debug.Print strSQL 7 Set qdf = CurrentDb.CreateQueryDef("", strSQL) 8 qdf.Execute 9 Set qdf = Nothing

価格と個数を個別に紐づけて乗算しなければならないのは理解できるのですが
最終的に受注番号単位でさらに合計するのがとても難しいです。
上記のコードでは、個数の組み込み方が分からないので
受注番号単位でDSUMをかけているだけのものです。

すべてをいっぺんに可能にする良い方法はありますでしょうか。
どうかお力添えをお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sousuke

2020/06/10 12:16 編集

これを解決する手段はあるとは思いますが、その更新したテーブルを何に使うつもりですか? 仮にこれをレポートや編集しないフォームに表示したいだけならこのように更新する必要すらないです。
GoogleWindows

2020/06/11 00:01

sousuke様 そのご指摘はあまり好きではありません。 この手の質問でよく言われるご意見なのですが 必要か必要でないかは、そのシステムによるかと私は思っています。 更新する必要は確実にあります。 膨大な量のクエリとVBAが詰まった物流システムを改修しています。 この更新クエリがなければ、のちのちの加工データやログに影響を及ぼします。 小規模なDBであれば仰っている意味は理解できますが 状況は多岐に亘るので、DBの全容を把握されてから初めて述べられる意見だと私は思います。 少し感情的になってしまいましたが、最も苦手なご指摘でしたので、 未熟者ながらご意見させていただきました。 色々と考えていただいてありがとうございます。
sazi

2020/06/11 00:27

@GoogleWindowsさん sousukeさんは目的を問われているので別に要/不要を押し付けている訳ではありませんよ。 私は、目的はデータ補正なんだろうな位にしか思っていませんけど、sousukeさんの視点であれば賛同します。 ただ、それはシステムにとっての善意の意見であり、押しつけではありません。
GoogleWindows

2020/06/11 00:52

sazi様 助言下さり、ありがとうございます。 すみません、私の取り方がネガティブなのだと思います。 今までの経験から、こういった常套句は攻撃的な対応としか取れなくなっており お互いや第三者に不快な思いをさせる結果になってしまいましたことをお詫び申し上げます。 以後、同様の意見をいただいた際は、真摯に対応したいと思います。
guest

回答1

0

ベストアンサー

集計後の条件などはhavingで行います。

SQL

1update 出荷関連受注データ set 支払ID = 3 2where 支払ID = 2 3 and 受注番号 in ( 4 select 受注番号 from 出荷関連受注データ 5 group by 受注番号 6 having sum(価格* 個数) < 10000 7 )

SQL

1update 出荷関連受注データ set 支払ID = 4 2where 支払ID = 2 3 and 受注番号 in ( 4 select 受注番号 from 出荷関連受注データ 5 group by 受注番号 6 having sum(価格* 個数) >= 10000 7 )

まあ、どちらか一方を行った後の残りは、逆を設定する訳ですから、単純な更新クエリーでも良いと思いますけど。
(支払ID=3を設定した残りは4を設定する。)

SQL

1update 出荷関連受注データ set 支払ID = 4 2where 支払ID = 2

投稿2020/06/10 12:15

編集2020/06/11 00:49
sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GoogleWindows

2020/06/11 00:46

sazi様 ご回答いただき、ありがとうございます。 できました!  毎回素晴らしいコードをご提供くださり、ありがとうございます! havingというものがあるのですね! 今回このhavingが知れたことも 私にとってはとても大きな収穫でした! 頂戴したSQL文の意味は、きちんとひとつずつ理解していこうと思います! 支払IDは、受注データ取込の段階とその後の加工で二転三転しますので DB全体を変更するより、この更新クエリひとつで変更できるため、効率的かと考えました。 時間があれば、根本から改善すべきなのですが 現状の私ではこの方法が限界のようです。これから理解を深めていきます。 また、以下で構文エラーが出ておりましたので、修正いたしました。 gtoup → group 前回から重ね重ね本当にありがとうございます。 またご質問させていただいた際は、何卒よろしくお願い申し上げます。
sazi

2020/06/11 00:49

> 構文エラーが出ておりました 失礼しました。回答も修正しました。
GoogleWindows

2020/06/11 01:11

sazi様 修正とご報告、ありがとうございます。 この貴重なコードは、私を含め、同じ案件で悩まれている方々のお力になるかと思います。 心から感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問