Access 抽出データ件数のカウント更新について

このQ&Aのポイント
  • クエリーテーブルではなく、BUSYO_MSTのM_F_countにカウント結果を出す方法は?
  • BUSYO_MSTとM_Fileのテーブルを使用して、販売した数を更新する方法は?
  • クエリーテーブルに結果を出力できたが、M_Fileにカウント結果を出す方法は?
回答を見る
  • ベストアンサー

Access 抽出データ件数のカウント更新について

以下の2つのテーブルを用いて 販売した数を更新したいのですが、 どの様に作成すれば 良いのでしょうか? クエリーテーブルに結果を出力は出来たのですが、 クエリーテーブルではなく、BUSYO_MSTのM_F_countに カウント結果を出すには、どこを直せばいいでしょうか。 UPDATE BUSYO_MST SET M_F_count=( SELECT Count(M_File.key) AS M_F_count FROM BUSYO_MST LEFT JOIN M_File ON BUSYO_MST.Key = M_File.key GROUP BY BUSYO_MST.Key); ========================= << BUSYO_MST >> ID | key | M_F_count ---+-------------- 01 | バナナ | 0 02 | りんご | 2 03 | みかん | 1 << M_File >> ID | key ---+-------------- 01 | りんご 02 | みかん 03 | りんご

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

更新クエリにサブクエリを含むとエラーが生じます。 更新可能なクエリであることが必要 http://support.microsoft.com/default.aspx?scid=kb;ja;328828 の以下の部分。 フィールドの値の合計、平均、カウント、その他の集計値を計算するクエリでは、データを更新で きません。また、クロス集計クエリ、選択クエリ、集計値や集計関数を含むサブクエリから、[レコ ードの更新] 行にあるフィールドを参照する更新クエリではデータを更新できません。この問題を 回避するには、更新クエリの [レコードの更新] 行で [定義域集計関数] を使用します。これで、 クロス集計クエリ、選択クエリ、集計値や集計関数を含むサブクエリから、フィールドを参照でき るようになります。 したがって、個別に定義域集計関数を使用するか、 あるいは、コードでテーブルを一括更新するように します。 【一括更新の場合】 質問のクエリのサブクエリを少し変更して、 Q集計 SELECT M_File.key, Count(M_File.key) AS M_F_count FROM M_File GROUP BY M_File.key; というクエリQ集計を作成します。 以下を標準モジュールに貼り付け、 イミディエイトウィンドウでtest を実行してみてください。 なお、DAOを使用しているので コード表の参照設定で、 Microsoft DAO xx Object Library のチェックを確認してください。 Sub test() Dim db As Database Dim rst As Recordset Dim rsq As Recordset Set db = CurrentDb Set rsq = db.OpenRecordset("Q集計", dbOpenDynaset) Set rst = db.OpenRecordset("BUSYO_MST", dbOpenDynaset) If rsq.RecordCount > 0 Then rsq.MoveFirst Do Until rsq.EOF rst.MoveFirst Do Until rst.EOF If rsq!Key = rst!Key Then rst.Edit rst!M_F_count = rsq!M_F_count rst.Update Exit Do End If rst.MoveNext Loop rsq.MoveNext Loop End If rst.Close: Set rst = Nothing rsq.Close: Set rsq = Nothing db.Close: Set db = Nothing End Sub また、このプロシージャを適当な名前に して、フォームなりのボタンクリックで Pribate Sub ボタン1_Click() Call test End Sub とすることもできます。

poporin0201
質問者

お礼

レスありがとうございました。 こちらの方法でやることにしました。

その他の回答 (3)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

>SELECT Count(M_File.key) AS M_F_count >FROM BUSYO_MST LEFT JOIN M_File ON BUSYO_MST.Key = M_File.key >GROUP BY BUSYO_MST.Key というのは [Count] 0 2 1 のカウント数の項目だけ、他テーブルと紐付けるキーがありませんね。 それと、 このカウントを求めるのに「BUSYO_MST」との紐付けは必要ですか?。 ここで、紐付けが無くても りんご 2 みかん 1 という(発生分の)2個のレコードは生成できます。 これを基にBUSYO_MSTを更新する、という手もあります。 バナナ 5→0 りんご 1→0 みかん 3→0 と全部0でクリアしておいて りんご 2 みかん 1 の情報から バナナ 5→0 りんご 1→0→2 みかん 3→0→1 です。 いずれにしても、そのエラーメッセージの説明内容をよく見てからです。 「BUSYO_MST」が カウントするための基になっているテーブルであり、 カウント更新するための更新先のテーブルです。 普通に考えるとそれでうまく行くの?、となりますよね?。

poporin0201
質問者

お礼

基本でした。ご教授ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。 No2の最初の、 >更新クエリにサブクエリを含むとエラーが生じます。 は、 更新クエリに集計関数のあるサブクエリを含むとエラーが生じます。 です。

poporin0201
質問者

お礼

勉強になりました。 ありがとうございます。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

『更新可能なクエリであることが必要です。』 が出たのでは?。 カウント求めるときに使われるテーブルを直接更新している、そんなことになってますか?。 更新用の『SELECT~』文においてはカウントだけの項目です。なので、更新先のテーブルと結合させる項目キーがありませんね?。 いったんテーブルに作成することは考えてますか?。

poporin0201
質問者

補足

>『更新可能なクエリであることが必要です。』 >が出たのでは?。 おっしゃられる通りです。 更新可能なクエリであることが必要ですの意味がわかりませんでした。 >更新先のテーブルと結合させる項目キーがありませんね?。 IDを入れないといけないのでしょうか。 まだまだ初心者で、どこに入れればいいのか思いつきません。 >いったんテーブルに作成することは考えてますか?。 考えていません。 試しにBUSYO_MSTを全部一緒に書き出すのと同時には出来ました。 INSERT INTO BUSYO_MST ( [key], F_No, LineCD, 部門名, 部署CD, 部署名, M_F_count ) SELECT DISTINCT M_File.key, M_File.F_No, M_File.LineCD, M_File.部門名, M_File.部署CD, M_File.部署名, Count(M_File.key) AS M_F_count FROM M_File GROUP BY M_File.key, M_File.F_No, M_File.LineCD, M_File.部門名, M_File.部署CD, M_File.部署名 HAVING (((M_File.部署CD) Is Not Null));

関連するQ&A

  • Access 抽出データ件数のカウント方法について

    初心者なので、初歩的な質問で申し訳ありません。 以下の2つのテーブルを用いて 販売した数を数える_クエリテーブルを 作成したいのですが、どの様に作成すれば 良いのでしょうか? 期待するクエリーテーブルの結果は << Q_Goods_Master >>の様な結果です。 ========================= << T_Goods_Master >> ID | GoodsName ---+-------------- 01 | バナナ 02 | りんご 03 | みかん << T_Sales_Data >> ID | GoodsName ---+-------------- 01 | りんご 02 | みかん 03 | りんご ========================= << Q_Goods_Master >> GoodsName | Qty ----------+---- バナナ | 0 りんご | 2 みかん | 1

  • ACCESSのデータ抽出について

    項目が同じ(1)テーブルと(2)テーブルと(3)の産地データをリレーションシップでつなぎデータ■クエリ_結果2のように抽出したいのですが■クエリ_結果2のちょうに重複するデータしか抽出できません。 どうしたら結果1のように全ての商品を抽出できるでしょうか? アクセス初心者です。よろしいくお願いします (1)テーブル【中央11月データ】 バナナ 50 りんご 10 ミカン 100 (2)テーブル【関西11月データ】 バナナ 30 梨 60 (3)産地データ バナナ フィリピン りんご 青森 みかん 愛媛 梨 千葉 ■クエリ_結果1 バナナ フィリピン 80 りんご 青森 10 みかん 愛媛 100 梨 千葉 60 ■クエリ_結果2 バナナ フィリピン 80

  • アクセスの2つのテーブルから重複しないものを抜き出す方法について

    アクセスの2つのテーブルから重複しないものを抜き出す方法について 例えば テーブル Aには ID   価格    商品   1  200    りんご   2  150    みかん   3  180    りんご   4  230    いちご テーブル Bには   1  150    みかん   2  180    りんご とあった場合 A-B のクエリーを実行して   1  200    りんご   2  230    いちご という結果を得たいのですが、どのようにすれば出来るのでしょうか よろしくお願いします。

  • データの抽出およびデータ件数

    こんにちは。お世話になっております。 お忙しい中恐縮ですが、アドバイスを頂戴出来ればと投函させていただきます。 siwake: no id group_type 1  2  未分類 2  1  未分類 3  1  売上 4  1  仕入 5  2  売上 6  1  仕入 group_select: no id group_type 1  1  未分類 2  1  売上 3  1  仕入 4  2  未分類 5  2  売上 以上のようなテーブル(shiwakeは日々蓄積されるデータ。group_typeは基本となるべく区分用データ)があり(各idはそれぞれのデータを紐付けるためのもの)、下記のようにgroup_selectにてidを検索した際、group_typeを表示、かつshiwakeテーブル内にある、同じidで登録のある、group_typeの件数を表示させたく考えてます。 id=1を検索 group_type 件数 未分類   1 売上    1 仕入    2 そこで、これまで検索に関し、多くのアドバイスを頂いていることから下記コードを記述してみましたが、エラーもないまま結果が返ってきません。 毎度お恥ずかしい質問で恐縮ですが、今一度ご指導いただければと、投函させていただきました。 お忙しい中恐縮ですが、宜しくお願い申し上げます。 $sql = "select FG.`no`, FG.`id`, FG.` group_type`, F.`no`, F.`id`, count(F.`no`) as `count` from `siwake` AS F right join `group_select` AS FG on FG.`no` = F.`id` where FG.`id` = '$id' group by FG.`no` order by FG.`no` desc";

    • ベストアンサー
    • MySQL
  • Accessのクエリーで。

    テーブルA ID テーブルB ID 年 種類 テーブルC ID 年 種類 備考 テーブルCはBの詳細をかいたようなものになっていて、希望した時だけみられるようになっています(クリックする)。 これらのテーブルをもとにクエリーを作成しました。 テーブルA-B-Cの「ID」でリレーションがされています。 B-Cの「年」もリレーションされています。 たとえば、10というIDの人がいて、2001年と2002年のデータがあったとします。 ID | 年   | 種類 | 備考 10 | 2001 | みかん | 10 | 2002 | りんご | 青森産 10 | 2002 | みかん |愛媛産 10 | 2002 | めろん | というような感じだとします。 これがそれぞれABCに入っています。 クエリーのリレーションで「種類」にリレーションを貼らないと、 10 | 2002 | りんご | 青森産 10 | 2002 | りんご | 愛媛産 10 | 2002 | りんご | 10 | 2002 | みかん | 青森産 10 | 2002 | みかん | 愛媛産 10 | 2002 | みかん | 10 | 2002 | めろん | 青森産 10 | 2002 | めろん | 愛媛産 10 | 2002 | めろん | とダブッてしまい、「種類」でリレーションをはると 10 | 2002 | りんご | 青森産 10 | 2002 | みかん | 愛媛産 と、備考に何かが入ってるものしか出なくなってしまいます。 これを回避するにはどのようにしたらいいのでしょうか? よろしくお願いします。 AC2000です。

  • 3つのテーブルからのデータ抽出

    こんにちは。お世話になっております。 http://oshiete1.goo.ne.jp/qa3421595.html 以前、上記箇所にて似たような質問をさせていただきましたが、同じテーブルを用い、違う検索結果を出そうとしたところ、思うような結果を得られずに居る次第です。 今日も一日中試行錯誤を繰り返しているのですが、どうにも描いている結果を得ることが出来ません。お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。(MySQL 4.1) 前回の質問は・・・ memberテーブル id  n_name 1  大輔 2  雅彦 3  順子 4  幸子 5  明美 6  二郎 friendテーブル(id、f_idは、memberテーブルのidを指す。) no id f_id 1  3  5 2  5  3 3  3  1 4  1  3 5  3  6 6  6  3 diaryテーブル(idはmemberテーブルのidを指す。memberのidに該当する人の発言データ) no id  date  subject 1  3   //  今日は寒いね 2  5   //  美味しそう 3  2   //  疲れたな 4  2   //  頑張ろう 5  1   //  楽しいぞ 6  6   //  晴れるといいな ※dateは省略しています。 以上、例えばmemberテーブルにおいて、id(下記SQLでは$tb_idとしています)が3の順子を検索した際、 friendテーブルを参照し、idカラムが3の相手であるf_idを見つけ、更にそのf_idを基にmemberテーブル内のn_name、 かつdiaryテーブル内の、date、subjectを下記のように一覧表示させたいという質問でした。 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう と、ここで、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 以上のように自分の発言を表示させようと、したところ現在、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 順子 今日は寒いね と、自分の発言が2度出てきてしまう状態です。 ちなみにSQL文は、 $sql = "select c.subject,m2.n_name,c.date,c.no,f.f_id,f.id from member as m inner join friend as f on m.id=f.id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id WHERE ((f.id=$tb_id OR f.f_id=$tb_id) AND f.id!=f.f_id) order by no desc LIMIT 0, 30;"; ここ数日、色々調べており、特に昨夜からは(今日も一日中。汗)ずっと試行錯誤を繰り返しているのですが、思い描く結果を得ることが 出来ない状態です。 お忙しい中恐縮では御座いますが、アドバイスのほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • テーブルごとのカウント

    PHP5.2+mysql 5.0.45で開発を行っております。 SQLに関する質問なのですが 以下のことが可能かどうかご教授いただきたく。 4つのテーブルがあります。 (例は適当です。項目の名称等は無視してください。) テーブルA ID Name Kana テーブルB ID NameID Pref City テーブルC ID NameID Tel Fax テーブルD ID NameID email CellPhone とします。 A.ID=1000の時各テーブルのレコード数が A:B:C:D=1:3:2:2となっています。 SQLの出力結果として A.ID A.Name A.Kana B.Count(ID) C.Count(ID) D.Count(ID) という、6項目を出力したいのですが 方法がわかりません。 試してみたのは select A.ID,A.Name,A.Kana,Count(B.ID),Count(C.ID),Count(D.ID) from A left join B on A.ID = B.NameID left join C on A.ID = C.NameID left join D on A.ID = D.NameID where A.ID = 1000 group by A.ID,A.Name,A.Kana ですが 結果、 A.ID = 1000 A.Name = Name A.Kana = Kana Count(B.ID) = 3 Count(C.ID) = 3 Count(D.ID) = 3 となってしまいます。 冷静に考えるとそうなんですが・・・ もしうまく結果を取得できる方法があればご教授いただきたく よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 2つのテーブルを結合してデータ抽出時に

    2つのテーブルからデータを取得したいです。 結合し、データの取得を試みてますが、キーに対して空白の行が取得できません。どうしたらよいでしょうか?助けてください。 Aテーブル   Bテーブル 1 100 A       1 みかん 2 150 B       2 りんご 4 200 D       3 すいか 5 300 E       4 なし 6 500 F       6 高級なし 上記のようなテーブルをくっつける時の話で求める値は以下なんですが… Cテーブル 1  100  A  みかん 2  150  B  りんご 3       すいか 4  200  D  なし 5  300  E 6  500  F  高級なし どちらかがデータなしでもキー(例の場合は1とかの数字です)があるもの は表示したいです。 どなたかわかるかた教えてください。お願いします。 ちなみに使用しているのはoracleです。

  • フィルターが掛かった状態でクエりで連番

    クエリでフィルターが掛かった時、連番を付ける事をしたいのですが、この式だと下記の様に連番を付ける事が出来ませんでしたのでご教授頂けれは幸いです。 連番: Val(DCount("*","テーブル名称","ID <= " & [ID])) 例1> テーブル例 ID 品名 1 みかん 2 りんご 3 ぶどう 4 みかん 5 りんご 6 みかん クエリ例 品名 みかんをフィルター ID 品名 連番 1 みかん 1 4 みかん 2 6 みかん 3 例2> テーブル例 ID 品名 120 みかん 121 りんご 123 ぶどう 124 みかん 125 りんご 126 みかん クエリ例 品名 みかんをフィルター ID 品名 連番 120 みかん 1 124 みかん 2 126 みかん 3

  • access2010行カウント→テーブル更新

    access2010についてのご相談です。 現在表彰システムの作成を行っています。 1 対象者テーブル・・・識別ID(主キー),氏名,性別など・・・ 2 表彰カウントテーブル・・・識別ID,表彰年度,該当大会名,成績・・・・ 上記二つのテーブルがあり,識別IDで結合し,下記のクエリを作成しています。 1 個人表彰クエリ・・・識別ID,表彰年度,氏名,性別,該当大会名,成績・・・・ 上記クエリには過去の大会で優勝した記録が羅列される形となります。 ここで,過去の優勝回数が3回→特別賞,2回なら→敢闘賞などと集計し,その結果をレポートにしたいと考えております。ただし同一年度に2つの大会で優勝(2行ある)したとしてもそれは,1回の優勝としてカウントしたいです。 個人表彰クエリのうち,識別ID・表彰年度でグループ化された行数をカウントし,最終表彰種類として対象者テーブルにフィールドを追加して更新をかけたりすれば良いのかなと考えております。 が,どのように実現するのか分からず頭をかかえております。 アドバイスをいただければ幸いです。よろしくお願いいたします。