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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2746閲覧

AccessVBA SQLのCount値でのUPDATE

tatsutatsu

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/10/04 16:14

前提・実現したいこと

テーブルT_Aで
nameフィールドが「aaa」かつnumフィールドが「1」のレコードの
storeIDの値を特定して、
テーブルT_Aにある同値のstoreIDを持つレコードに、上の条件に合致したレコード数をnumCountフィールドに入力したいです。

なお、主キーはこれらとは別フィールドに設定されています。

図で表すと、下記のようなイメージです。

実行前
storeID name num numCount
1    aaa  1   null
1    aaa  1   null
1    aaa  0   null
2    aaa  1   null
2    aaa  0   null
2    aaa  0   null
3    aaa  0   null
3    aaa  0   null


実行後
storeID name num numCount
1    aaa  1   2
1    aaa  1   2
1    aaa  0   2
2    aaa  1   1
2    aaa  0   1
2    aaa  0   1
3    aaa  0   null
3    aaa  0   null


以下コードを試してみましたが、エラーが出てしまいました。
これは自分でも根本的に間違っている気がしているのですが、どこをどう間違っているかも分からなくなっています。。。
是非ご教示いただければありがたいです。
よろしくお願いします。

発生している問題・エラーメッセージ

クエリに、集計関数の一部として指定された式'numCount'が含まれていません。

該当のソースコード

VBA

1Dim db As DAO.Database 2Set db = CurrentDb 3 4Dim mySql As String 5 6mySql = "UPDATE T_A" 7mySql = mySql & " SET numCount = Count(num)" 8mySql = mySql & " WHERE storeID IN(" 9mySql = mySql & " SELECT storeID from T_A" 10mySql = mySql & " WHERE name = 'aaa' AND num = 1)" 11 12db.Execute strSQL, dbFailOnError 13 14db.Close 15Set db = Nothing

補足情報(FW/ツールのバージョンなど)

Access2016

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

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

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

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

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

guest

回答2

0

numCount列の必要性はこの際おいといて。
Accessのクエリは集計値でupdateできない困った仕様なんですが、
その独特の仕様を突いて集計することは可能です。

未検証ですがこんな感じです。

sql

1update T_A as A 2 INNER JOIN T_A AS B ON A.storeID = B.storeID 3set A.numCount=nz(A.numCount,0)+1 4where B.name='aaa' 5 and B.num=1

一行ずつupdateされるイメージで式を書くとsumやcount相当の更新クエリを
書くことができます。

訂正

間違えてたので訂正
num=1確定ならnumを積み上げる感じで書けばいいかな

sql

1UPDATE T_A AS A 2 INNER JOIN T_A AS B ON A.StoreID = B.StoreID 3SET A.numCount = Nz([A].[numCount],0)+Nz([B].[num],0) 4where B.name='aaa'; 5

StoreID=3をnullにしたいならwhere句にB.num=1も入れて
あとこれやるときは先にリセット用の更新クエリも走らせる必要あるかな

sql

1UPDATE T_A AS A 2SET A.numCount = null; 3

投稿2020/10/05 04:51

編集2020/10/05 07:40
sousuke

総合スコア3828

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

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

sazi

2020/10/05 06:23

num=0が設定されませんよ
sousuke

2020/10/05 06:49

あー文章読み違えてますね直しておきます
tatsutatsu

2020/10/10 17:34

お返事が遅くなり申し訳ありませんでした。 こんなやり方もあるんですね。。まったく思いつきもしませんでした。 今回はベストアンサーの方のコードで解決できましたが、知見が深まりました。ありがとうございます。 また、機会がございましたらよろしくお願いします。
guest

0

ベストアンサー

エラー内容は基本的な事です。

一体SQLの構文はどのように学習していますか?

更新クエリーで集計関数は使用できませんので、Dcount()などのD系関数を使用する事になりますが、そもそも自身のカウントを同じテーブルに持つべきではありません。

SQL

1UPDATE T_A 2SET numCount = Dcount('*', 'T_A','storeID=' & storeID & ' and name= ''' & name & ''' and num=1') 3WHERE name = 'aaa'

投稿2020/10/04 16:46

編集2020/10/04 17:07
sazi

総合スコア25138

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

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

tatsutatsu

2020/10/10 17:31

お返事が遅くなり申し訳ございません。 無事解決できました。また、構文の理解というか、基本的なところから確認してみてようやく理解ができました。 データベースの考え方もご教示頂きありがとうございます。 拙い質問に回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問