• ベストアンサー

ACCESSで購入回数を表示する方法 (クエリ、VBA)

[既存のテーブル] 2008年1月1日 Aさん 2008年1月2日 Bさん 2008年1月3日 Cさん 2008年1月4日 Aさん 2008年1月5日 Aさん 2008年1月6日 Cさん 2008年1月7日 Cさん 2008年1月8日 Bさん 2008年1月9日 Aさん [求めるカタチ] 2008年1月1日 Aさん 1回目 2008年1月2日 Bさん 1回目 2008年1月3日 Cさん 1回目 2008年1月4日 Aさん 2回目 2008年1月5日 Aさん 3回目 2008年1月6日 Cさん 2回目 2008年1月7日 Cさん 3回目 2008年1月8日 Bさん 2回目 2008年1月9日 Aさん 4回目 ACCESSで「既存のテーブル」を「求めるカタチ」のようにしたいと考えています。 クエリを使う方法が思いつかなかったため、DAOを使って一行ずつ更新する方法を取ってはみたのですが、時間がかかってしまうため、何か効率的な方法を探しています。 アドバイスお願いいたします。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

抽出だけならNo.1の方のSQLで大丈夫です。 但し、既存のテーブルに「何回目」というフィールドがあり、それを 更新したいとなると、話が別です。更新クエリは1:1、又は1:nのn側だけ 更新することができます。既存テーブルが日付と人名をキーにしている場合、 結合相手もこの項目で一意になることが必要です。しかし、クエリが結合相手ですと、 クエリには一意キーが無いので、ターゲットに対して相手が複数になる可能性が 否定できません。つまり、ターゲットが1:nの1側になると言うことです。 人間には一意になると分かっていますが、物理的な一意キーがない以上、 機械的に更新不可能と判断さてしまいます。 これを回避するには同じレイアウトで、日付と人名を一意キーとする一時テーブルを 作成します。ここにNo.1の方のSQLを基にしてINSERTを行い、これと結合させれば、 一意キー同士の結合なので、1:1の関係が保証され、更新可能になります。

kanata_005
質問者

お礼

丁寧なフォローありがとうございます。 No.1の方に教えたいただいた方法で解決しました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

クエリデザイナでやるなら そのテーブルを2個追加します 年月日、氏名、年月日 フィールドを追加して集計をONにします 2番目の年月日をカウントにします 新たに 年月日、氏名を追加して テーブルを2個目テーブル名にして集計をWhere条件にします # _1などが追加されているテーブル名 追加した年月日の抽出条件に <=[元テーブル名]![年月日] 追加した氏名の抽出条件に =[元テーブル名]![氏名] とします 出来上がったSQLです SELECT myTable03.myDate, myTable03.myName, Count(myTable03.myDate) AS myDateのカウント FROM myTable03, myTable03 AS myTable03_1 WHERE (((myTable03_1.myDate)<=[myTable03]![myDate]) AND ((myTable03_1.myName)=[myTable03]![myName])) GROUP BY myTable03.myDate, myTable03.myName ORDER BY myTable03.myDate; # Dxak氏のSQLをAccess2003で実行しましたが希望の結果が得られませんでした # 元テーブルと追加テーブルを結合してしまうとだめなようです

kanata_005
質問者

お礼

詳しい説明ありがとうございます。 Dxakさんに教えていただいた方法にちょっと手を加えたところ解決しました。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

カテが違うんですけど・・・ テーブル名「例えば」 「年月日」、「氏名」で、フィールド名が初期として SQL文で SELECT 例えば.年月日, 例えば.氏名, Count(例えば.年月日) AS 回数 FROM 例えば INNER JOIN 例えば AS 例えば_1 ON 例えば.氏名 = 例えば_1.氏名 WHERE 例えば_1.年月日<=[例えば]![年月日] GROUP BY 例えば.年月日, 例えば.氏名; で、結果は出ますよ 「回目」と、言うのは表示形式で代用してください

kanata_005
質問者

お礼

カテ違い申し訳ありませんでした。 教えていただいた方法を参考にしたところ解決しました。 ありがとうございます。

関連するQ&A