アクセスフィールド値を分割する方法
- アクセスのテーブル・フィールドに入っている値を区切って分割する方法を教えてください。
- 値が連結されたフィールドを分割して、注文商品ごとにフィールドにまとめ直したいです。
- テーブルの更新や予備フィールドの作成を利用して、連結された値を効率的に分割する方法を教えてください。
- ベストアンサー
アクセス フィールド値を分割したい
いつも大変お世話になっております。 初心者につき、ご教示いただけますと幸いです。 アクセスのテーブル・フィールドに AAAA,BBBB,CCCC という値が入ってしまうため 「,」を区切りに分割したいです。 テーブル:T_商品 フィールド: 顧客ID|注文内容(連結で入ってしまうフィールド) 0001|AAAA 0002|AAAA,BBBB 0010|AAAA,BBBB,CCCC 0101|AAAA,BBBB,CCCC,DDDD,・・・ といったように、連結した値の数はまちまちで、 最大10個になります。 ちなみに、 これを ↓フィールド名 顧客ID|注文商品 に 0001|AAAA 0002|AAAA 0002|BBBB 0010|AAAA 0010|BBBB 0010|CCCC ・ ・ ・ といったように、 最終的には 1つのフィールドにまとめたいです。 ご教示のほど、よろしくお願い致します。 尚、前半の「連結値を分割」だけでも テーブル更新(分割毎にフィールドに挿入)できれば、とても助かります! →この場合、予備フィールドなどを作成しておくか、 ワークテーブルなどで処理になりますでしょうか。 是非とも、よろしくお願い致します。
- aka_ao
- お礼率50% (26/52)
- Visual Basic
- 回答数11
- ありがとう数16
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
新しいテーブルを用意し、名前をいちおうT_Tempとします。 フィールドは、 顧客ID テキスト型 注文商品 テキスト型 とします。 DAOを使用するので参照設定でDAOにチェックが入っているか確認してください。 Sub test1() Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim buf As Variant Dim i As Long Set db = CurrentDb Set rs1 = db.OpenRecordset("T_商品") Set rs2 = db.OpenRecordset("T_Temp", dbOpenDynaset) If rs1.RecordCount > 0 Then rs1.MoveFirst Do Until rs1.EOF buf = Split(rs1!注文内容, ",") For i = 0 To UBound(buf) rs2.AddNew rs2!顧客ID = rs1!顧客ID rs2!注文商品 = buf(i) rs2.Update Next i rs1.MoveNext Loop End If rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Sub わからないところがあれば補足してください。
その他の回答 (10)
- piroin654
- ベストアンサー率75% (692/917)
>そもそも「注文商品」がnullのレコードがあったようです。まずはそこを >整備してから動かしたら、きちんと分割できました!お騒がせして申し訳 >ありませんでした! はい、確認。やはりそうでしたか。一応、No10で対策をいれておきました。 メッセージボックスは不要ならばMsgBoxのところをコメントアウトして おいてください。
お礼
何から何まで ご親切にありがとうございました!
- piroin654
- ベストアンサー率75% (692/917)
以下のように If IsNull(rs1!注文内容) Then MsgBox ("注文内容が空です.次のレコードに移動します") Exit Do End If を追加してみてください。 Do Until rs1.EOF If IsNull(rs1!注文内容) Then MsgBox ("注文内容が空です.次のレコードに移動します") Exit Do End If buf = Split(rs1!注文内容, ",") たぶん、T_商品の「注文内容」にデータが入っていないか、あるいは なんらかの理由でデータが取得できていないのかもしれません。 これでどうなるか確認してみてください。 >注文商品が1つの場合の「,」が無いものが、拾えないようです。 こちらでは拾えているのでそれが問題ではないようです。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
1、標準モジュールにCutStr()をコピペ。 2、修正したユニオンクエリをクエリにコピペ。 (1)テーブル名を質問者のに修正。 (2)列名を質問者のに修正。 (3)SELECT文を10個並べる。 SELECT ID, CutStr(注文内容,",",1) AS 注文 FROM テーブル2; UNION ・・・・・ SELECT ID, CutStr(注文内容,",",10) AS 注文 FROM テーブル2; UNION ・・・・・ (4)適当な名前で保存。 ※ユニオンクエリは、SQLビューを開いてコピペします。 3、目的のクエリをコピペ。 (1)SQLビューを開く。 (2)コピペする。 (3)列とクエリ名を修正する。 クエリ8->2で保存したユニオンクエリの名前 以上で目的は達成できます。 なお、別テーブルへの登録は、下記のSQL文を実行することでできます。 INSERT INTO テーブル3 SELECT * FROM ユニオンクエリ WHERE 注文<>""; これも、SQLビューにコピペしてクエリ名、列名を合致させるだけです。なお、[イミディエイトウインドウ]でも SQL文を実行する関数(CnnExecute())の類を用意すれば可能です。
お礼
手順のご説明までいただき、ありがとうございます。 ユニオンクエリはあまり理解できていなかったのですが、今回、とても参考になりました。ありがとうございます。
- piroin654
- ベストアンサー率75% (692/917)
>No.1の部分の「buf = Split(rs1!BO, ",")」でnullの使い方が >不正です。というエラーが出てしまいます。 ひょっとしたらT_商品にカンマ切りした箇所で、空の文字列が はいっているのかもしれません。 一応、T_Tempのデザインビューで「注文商品」の「空文字列の許可」 を「はい」にしてみてください。もしエラーがでなければ、切り分けられた データをテーブルで確認してみてください。
お礼
どうやら、全く動かないのではなく、注文商品が2つの場合は動いているようで、注文商品が1つの場合の「,」が無いものが、拾えないようです。これがエラーになる要因でしょうか?お手数おかけしますが、よろしくお願い致します。
補足
注文商品」の「空文字列の許可」を「はい」になっていますが、やはりnullの使い方が不正です。というエラーが出てしまいます。すみません。
- piroin654
- ベストアンサー率75% (692/917)
>T_Tempは、前もって作成しておくテーブルなんでしょうか? そうです。質問での >ワークテーブルなどで処理になりますでしょうか。 になります。 フィールドは、 顧客ID テキスト型 注文商品 テキスト型 とします。 切り分けたデータをこのテーブルに書き込み、 T_商品と差し替えてこのT_TempをT_商品 とします。この差し替えはNo5、No6に記載 している通りです。確認してみてください。
お礼
ありがとうございます!!!!!!!!
補足
No.8のお礼コメントの訂正です。 そもそも「注文商品」がnullのレコードがあったようです。まずはそこを整備してから動かしたら、きちんと分割できました!お騒がせして申し訳ありませんでした! また、親切なご対応、本当に感謝しております。ありがとうございました!!
- piroin654
- ベストアンサー率75% (692/917)
No5の続きです。 本当はいきなり、 DoCmd.DeleteObject acTable, "T_商品" DoCmd.Rename "T_商品", acTable, "T_Temp" のように、元テーブルの「T_商品」を削除し、 「T_Temp」を「T_商品」に名前を変更しても構わないのですが。 そのあたりは、現状に応じてアレンジしてください。 わからないところがあれば補足してください。
- piroin654
- ベストアンサー率75% (692/917)
No1です。 肝心なことを忘れていました。 「T_商品」と「T_Temp」のそれぞれの名前を変更して テーブルを差し替えます。つまり、 「T_商品」を「T_商品_お祓い箱」 「T_Temp」を「T_商品」 にします。 そこで、No1のコードの終わりのところで、 rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing On Error Resume Next DoCmd.Rename "T_商品_お祓い箱", acTable, "T_商品" DoCmd.Rename "T_商品", acTable, "T_Temp" 'DoCmd.DeleteObject acTable, "T_商品_お祓い箱" On Error Resume 0 End Sub のように、 DoCmd.Rename "T_商品_お祓い箱", acTable, "T_商品" DoCmd.Rename "T_商品", acTable, "T_Temp" を追加しておきます。 また、一応上記ではコメントアウトしていますが、 'DoCmd.DeleteObject acTable, "T_商品_お祓い箱" で、不要になるであろう元の「T_商品」テーブルを削除します。 必要ならばコメントアウトを解除してください。 以上のことは、「T_商品」から「T_Temp」へデータが 移動できたかを確認してからコードに実装してもよろしいかと。 わからないところがあれば補足してください。
補足
すみません!No.1の部分の「buf = Split(rs1!BO, ",")」でnullの使い方が不正です。というエラーが出てしまいます。ご教示いただけますか。よろしくお願いします。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足の補足】 Where節は最終クエリには不要でした。 ユニオンクエリを基にINSERTするのであれば必要。 《Insert SQL 1》 INSERT INTO テーブル3 SELECT * FROM ユニオンクエリ WHERE 注文<>""; 《Insert SQL 2》 INSERT INTO テーブル3 SELECT * FROM 最終クエリ;
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足】最終クエリをテーブルにINSERTするには? 追加クエリと呼ばれるSQL 文を書きます。 INSERT INTO テーブル3 SELECT * FROM クエリ WHERE 注文<>""; なお、添付図は、CnnExecute()、DBSelect()はAccessのそれではありません。回答の説明のために書いた関数です。 PS、ユニオンは、もちろん10個並べます。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Q、フィールド値を分割するには? A、SQL文で分割できますよ。 標準モジュールに次の関数を登録しておけば、よりシンプルなSQLを書けます。 Public Function CutStr(ByVal Text As String, _ ByVal Separator As String, _ ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function 【ユニオンクエリ】 SELECT ID, CutStr(注文内容,",",1) AS 注文 FROM テーブル2; UNION SELECT ID, CutStr(注文内容,",",2) AS 注文 FROM テーブル2; UNION SELECT ID, CutStr(注文内容,",",3) AS 注文 FROM テーブル2; 【目的のクエリ】 SELECT クエリ8.ID, クエリ8.注文 FROM クエリ8 WHERE (((クエリ8.注文)<>"")) ORDEY BY クエリ8.ID; 添付図のユニオンクエリの実行結果には、注文が空文も含まれています。それを除外するSQL文を書けば目的を達成することが出来ます。なお、ORDER BY 節は必要です。その並びは絶対保証ではありませんので・・・
補足
初心者につき、ユニオンクエリが理解できていないので、モジュールを追加するまでは理解できたんですが、そのあとから何がなんだか・・・すみません。ユニオンクエリをご教示いただいたコードで作成+SQLクエリをご教示いただいたコードで作成するんでしょうか?それらの名称はどうすれば連携しますか??お手数おかけします!!
関連するQ&A
- ACCESSにて2つのテーブルの比較
2つのテーブルA,テーブルBがあります。テーブルBのデータ以外のデータを選ぶにはどうのようにすれば良いのでしょうか? テーブルA data--- aaaa bbbb cccc dddd aaaa cccc テーブルB data--- aaaa bbbb 欲しい結果 テーブルA data--- cccc dddd cccc よろしくお願い致します。
- ベストアンサー
- オフィス系ソフト
- 連結したフィールドでグループ化し、他のフィールドの最大値のレコード全体を抽出
図面管理のデータベースをつくっています。 連結したフィールドでグループ化し、他のフィールドの最大値のレコード全体を抽出したいのですが どのようにしたらいいのでしょうか? いろいろ調べたのですがなかなかよい結果が出ません。 お知恵をおかしください。よろしくお願いします。 mysqlバージョン:5.0.45 例 テーブル:a(図面管理) a_id(id) a1(図番) a2(種類用紙サイズ) a3(枝番) a4(図面名) a_id a1 a2 a3 a4 1 1 3P 0 aaaa 2 2 3P 0 bbbb 3 2 3P 1 bbbb 4 1 4P 0 cccc 5 1 4P 1 cccc 6 1 4P 1 cccc このテーブルのa1とa2を連結します。(連結フィールド:ren) a_id a1 a2 a3 a4 ren 1 1 3P 0 aaaa 13P 2 2 3P 0 bbbb 23P 3 2 3P 1 bbbb 23P 4 1 4P 0 cccc 14P 5 1 4P 1 cccc 14P 6 1 4P 2 cccc 14P 連結したもの(ren)をグループ化しますこのとき、枝番の値が高いレコードだけ抽出します。 a_id a1 a2 a3 a4 ren 1 1 3P 0 aaaa 13P 3 2 3P 1 bbbb 23P 6 1 4P 2 cccc 14P この最終的な結果を出す方法をお教えください。 おねがいします。
- ベストアンサー
- MySQL
- Access Union について
下記2テーブルがあります。 テーブル1 品番 1月合計 AAAA 1111 BBBB 2222 CCCC 1122 EEEE 3211 テーブル2 品番 2月合計 AAAA 1211 BBBB 3222 CCCC 1522 DDDD 2223 UNIONのSQL文で下記のような結果を得たいです。 品番 1月合計 2月合計 AAAA 1111 1211 BBBB 2222 3222 CCCC 1122 1522 DDDD 2223 EEEE 3211 SQL文をどのように書いたらいいですか。ご教授,お願い致します。
- 締切済み
- オフィス系ソフト
- UNIXで文字列分割
UNIXでマルチバイトの文字列で分割したいです。 例) aaaa bbbb cccc dddd eeee ffff ↓ [bbbb]で分割 [1]aaaa [2] cccc dddd eeee ffff できればawkで処理をしたいと考えています。
- ベストアンサー
- その他(プログラミング・開発)
- SQLでの集計
下記の様に、「複数のitemを買っているuserと購入されたitem」のテーブルと、 user item ---------------------------------- 田中 AAAA 田中 CCCC 田中 EEEE 北野 DDDD 北野 BBBB 北野 AAAA 小堺 CCCC 小堺 EEEE 松本 EEEE 松本 KKKK 松本 CCCC 松本 DDDD 浜田 BBBB 浜田 DDDD 下記の様な IDに紐付いた 「item」のテーブルから、 ID item ---------------------------------- 1 AAAA 2 BBBB 3 CCCC 4 DDDD 5 EEEE 下記の様に各itemと各itemを買った場合に一緒に買われるitemの一覧を結果 として表示させたいのですが、クエリの作り方が思い浮かばず、困っています。 ※)可能であれば、買われたitemを表示する際にはbuy1から(左側から)同時購入 回数の多いitemを重複せずに並べて表示したい ID item buy1 buy3 buy4 buy5 buy6・・・・ ---------------------------------- 1 AAAA CCCC BBBB DDDD EEEE 2 BBBB DDDD AAAA 3 CCCC AAAA EEEE DDDD KKKKK 4 DDDD AAAA BBBB CCCC EEEE 5 EEEE AAAA CCCC KKKKK 尚、IDと紐付いているitem数は決まっていますが、買われるitemの種類は上記 の様にIDが1~5だけではなく、集計してみないと判らない状況です。 今の所、SQLはACCESS(2003)上にて手打ちしています。 以上、ご教示のほど、宜しくお願い致します。
- ベストアンサー
- その他(データベース)
- mysqlについて
いつもお世話になっております。 またまたmysqlについて質問させていただきます。 下記のようなテーブルがあります。 tabel A | type_id | member_id | date| | 2 | 45| 2012-6-21 | | 2 | 46| 2012-6-22 | | 2 | 47| 2012-6-19 | | 2 | 48| 2012-6-10 | | 4 | 49| 2012-5-23 | | 4 | 50| 2012-5-24 | | 4 | 51| 2012-5-21 | | 4 | 52| 2012-5-22 | | 3 | 53| 2012-7-25 | | 3 | 54| 2012-7-26 | | 3 | 56| 2012-7-23 | | 3 | 57| 2012-7-24 | | 1 | 58| 2012-8-17 | | 1 | 59| 2012-8-18 | | 1 | 60| 2012-8-25 | | 1 | 61| 2012-8-26 | table B | type_id | name | | 1 | aaaa | | 2 | bbbb | | 3 | cccc | | 4 | dddd | 下記の条件で値を取得するSQLをご教授いただけますでしょうか 1.type_idでまとめたものを3件ずつ取得 (三件の中で一番直近のdateを持っているもの順にtype_idを並べる) 2.type_idのまとめた三件がdateの直近順 3.type_idのそれぞれのnameをくっつける 結果として | type_id | member_id | date|name | 4 | 51| 2012-5-21 |dddd | 4 | 49| 2012-5-23 |dddd | 4 | 50| 2012-5-24 |dddd | 2 | 48| 2012-6-10 |bbbb | 2 | 47| 2012-6-19 |bbbb | 2 | 45| 2012-6-21 |bbbb | 3 | 56| 2012-7-23 |cccc | 3 | 57| 2012-7-24 |cccc | 3 | 53| 2012-7-25 |cccc | 1 | 58| 2012-8-17 |aaaa | 1 | 59| 2012-8-18 |aaaa | 1 | 60| 2012-8-25 |aaaa 説明が下手ですみません…分かりにくければ補足説明いたします…
- ベストアンサー
- MySQL
- フィールドを連結しグループ化した時の値の枝番の最大値を常に表示
フィールドを連結しグループ化した時の値の枝番の最大値を常に表示 すいません。MYSQLでこんなことができるのかお教えください。 mysqlバージョンは、5.0.45を使用しています。 1.以下のような図面を管理するテーブルがあるとします。 例 テーブル:a(図面管理) a_id(id) a1(図番) a2(種類用紙サイズ) a3(枝番) a4(図面名) a_id a1 a2 a3 a4 1 1 3P 0 aaaa 2 2 3P 0 bbbb 3 2 3P 1 bbbb 4 1 4P 0 cccc 5 1 4P 1 cccc 6 1 4P 2 cccc 2.このテーブルのa1とa2を連結したとします。(連結フィールド:ren) ※a1とa2を連結した名称を図面名として使用しています。 ※a3が枝番で図面のマイナーチェンジのバージョンだとお考えください。 a_id a1 a2 a3 a4 ren 1 1 3P 0 aaaa 13P 2 2 3P 0 bbbb 23P 3 2 3P 1 bbbb 23P 4 1 4P 0 cccc 14P 5 1 4P 1 cccc 14P 6 1 4P 2 cccc 14P 3.この連結したフィールド(ren)の枝番(a3)の最大値(max_a3)をSQLで表示させたいのですがどのようにしたらいいのでしょうか? このような結果は求められるのでしょうか? 最終的な結果表示 a_id a1 a2 a3 a4 ren max_a3 1 1 3P 0 aaaa 13P 0 2 2 3P 0 bbbb 23P 1 3 2 3P 1 bbbb 23P 1 4 1 4P 0 cccc 14P 2 5 1 4P 1 cccc 14P 2 6 1 4P 2 cccc 14P 2 説明がへたかもしれませんがよろしくお願いします。
- ベストアンサー
- MySQL
- Excel抽出のマクロかVBAを教えてください
A列にxxxがあった場合、その上に存在するIDの値を抽出する方法を教えていただけますでしょうか? 例)xxxがあった場合、IDの値を抽出したい。 以下の場合、ID:1111とID:3333と表示したい。 (ID以降の値はランダムです) A列 ID:1111 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff ID:2222 aaaa bbbb cccc dddd eeee ffffff ID:3333 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff
- ベストアンサー
- Excel(エクセル)
- access で 方法を教えてください。
access で 方法を教えてください。 テーブルは セミコロン区切りで、区切られて表示されています (テーブル例) 1 aaaa;bbbb;cccc;dddd;eeee;ffff 2000byte 2 aaaa 300byte 3 bbbb;cccc;ffff 3000byte 4 ffff;dddd 120byte このセミコロン区切りの区切られたデータの 「件数」と「バイト」を表で表示させる方法を教えて欲しいのです。 上記テーブル例を使用しての(抽出例) 抽出条件 ↓ aaaa 2件 2500byte bbbb 2件 5000byte cccc 2件 5000byte dddd 2件 2120byte eeee 1件 2000byte ffff 3件 5120byte 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- データを西暦ごとにテーブルに分けたい
30万件ほどデータがあるテーブルtableがあります。 フィールドyearにそのデータが作成された西暦が4桁のint型で記されているのですが、 これを1年ごとに分割してテーブルを生成したいです。 ---------- table (id はオートインクリメント) id name year info 1 aaaa 2011 aaaaaaaa 2 bbbb 2012 bbbbbbbb 3 cccc 2010 ccccccc 4 dddd 2012 dddddddd 5 eeee 2011 eeeeeee : : ↓ table2010 id name year info 1 cccc 2010 ccccccc : : table2011 id name year info 1 aaaa 2011 aaaaaaaa 2 eeee 2011 eeeeeee : : table2012 id name year info 1 bbbb 2012 bbbbbbbb 2 dddd 2012 dddddddd : : ------------ データが数十件ならphpmyadminを駆使するのですが、今回はデータ量が多いこともあり、 これらを上手に分ける方法となると現在の私の力では難しいです。 このような形でテーブルを分割する方法を教えてください。 よろしくお願いします。
- ベストアンサー
- MySQL
お礼
失礼しました。T_Tempは、前もって作成しておくテーブルと記載いただいておりました。すみません。ご親切な明記、ありがとうございます。
補足
T_Tempは、前もって作成しておくテーブルなんでしょうか? 初心者につき、初歩的なことが理解できておりませんでしたら申し訳ありません。上記コードだけでは、その部分でエラーになって止まってしまうので・・・。