- 締切済み
アクセスのクエリで出来る事なのでしょうか?
以下の様な処理がクエリで出来るものかの判断がつかず、また、出来るとしてもクエリの作り方が判りません。。。 [テーブルA] コード 品名 種類 1111 A 0 1111 A 1 1111 A 2 1111 A 3 2222 B 0 2222 B 1 2222 B 2 2222 B 3 2222 B 4 3333 C 0 3333 C 1 3333 C 2 3333 C 3 3333 C 4 3333 C 5 3333 C 6 以上の様なフィールド構成を持つテーブルです。 「コード」で管理される「品名」の持つ「種類」の列の最大値を、新しく追加した「在庫」列を持つテーブルBの「在庫」列に抽出して以下の様に同一「コード」内に全て書き込みたいと思っておりますが、クエリ作成の勉強を始めたばかりで、上記の様な複雑(?)なクエリの作り方が判りません。 ※簡単なクエリをデザインビューで作ったり、SQL ビューで簡単な改造が出来る位です。 [テーブルB](処理後) コード 品名 種類 在庫 1111 A 0 3 1111 A 1 3 1111 A 2 3 1111 A 3 3 2222 B 0 4 2222 B 1 4 2222 B 2 4 2222 B 3 4 2222 B 4 4 3333 C 0 6 3333 C 1 6 3333 C 2 6 3333 C 3 6 3333 C 4 6 3333 C 5 6 3333 C 6 6 尚、「種類」列の値は必ず0から順番に(012345・・・の様に)並ぶ規則となっております。 テーブルAに「在庫」列を追加挿入してから「種類」の最大値を書き込む方法でも、テーブルB(テーブルAをコピーして「種類」列を追加したテーブル)に書き込ませる方法でもどちらでも問題はありません。 どなたかご教示頂ければと思います。宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
まず、順序よく攻めることが肝心です。 A: コード__品名__種類 1111___A___________0 1111___A___________1 2222___B___________0 2222___B___________1 3333___C___________0 3333___C___________1 3333___C___________2 [イミディエイト] ? DBSelect("SELECT コード, 品名, 種類, DMax('種類', 'A', 'コード=' & コード) As 在庫 FROM A",,vbCrLF) 1111;A;0;1; 1111;A;1;1; 2222;B;0;1; 2222;B;1;1; 3333;C;0;2; 3333;C;1;2; 3333;C;2;2; 上述のようにDMax関数を使うのが一番簡単です。 正規のSQL文は次のようでしょうが、これは、チト、Access のヘルプ文を熟読し幾つか経験すべきでしょう。 SELECT A.コード, A.品名, A.種類, X.在庫 FROM A LEFT JOIN [SELECT コード, MAX(種類) AS 在庫 FROM A GROUP BY コード]. AS X ON A.コード=X.コード; [イミディエイト] ? CNNExecute("SELECT コード, 品名, 種類, DMAX('種類', 'A', 'コード=' & コード) INTO B FROM A") True さて、DMax関数を使用した SELECT文の FROM 句の前に 'INTO B' を挿入して実行してみます。 コード__品名__種類__在庫 1111___A___________0______1 1111___A___________1______1 2222___B___________0______1 2222___B___________1______1 3333___C___________0______2 3333___C___________1______2 3333___C___________2______2 ところで、2度目は<テーブルBは既に存在します>というエラーが出ます。 [イミディエイト] ? CNNExecute("DROP TABLE B") True 一番簡単なのは、DROP TABLE 文でテーブル B を削除することです。 更に、一番簡単なのは、そもそもSQL文で何時でもBテーブルと同じ内容を得ることが出来るのでBなど作らないこと。 更に言えば、コードと品名を重複して登録するという<掟破り>はしないこと。 簡潔に説明するために DBSelect()、CNNExecute() を使っていますが、これらは説明用の自作関数です。 いずれも、クエリで試せます。
- mshr1962
- ベストアンサー率39% (7417/18945)
コードが数値ならクエリのフィールド欄に 在庫:DMax("[種類]","テーブルA","[コード]=" & [コード]) コードがテキストならクエリのフィールド欄に 在庫:DMax("[種類]","テーブルA","[コード]='" & [コード] & "'")
お礼
早々の回答有難う御座いました! コード(以外でも)、データ型を記載しておりませんでしたね・・・ 何分、アクセス初めてまだ一週間程度なので不慣れで申し訳有りません>< 頂いた回答、参考にさせて頂きます!
補足
【結果報告】 DMax関数を用いたクエリでは数千行程度での処理には問題は無かった のですが、数十万行の処理だと処理が重くなりすぎて動かなくなって しまいました。 現在は、2つのクエリ(「種類」の最大値を求めるクエリ・得られた結果 を「在庫」列として付加するクエリ)で対応してみました。 こちらは快適に処理が動きます
お礼
早々の回答有難う御座いました! 久々に考えすぎたのか、知恵熱(?)が出て二日ばかり寝込んでおりました・・・_| ̄|○ テーブルBは無しの方向で試してみたいと思います! コードと品名が重複しているのは、私の前任者からの伝統(?)と管理上 の問題なのであります。。。
補足
【結果報告】 DMax関数を用いたクエリでは数千行程度での処理には問題は無かった のですが、数十万行の処理だと処理が重くなりすぎて動かなくなって しまいました。 現在は、2つのクエリ(「種類」の最大値を求めるクエリ・得られた結果 を「在庫」列として付加するクエリ)で対応してみました。 こちらは快適に処理が動きます。