- ベストアンサー
[access]フィールドの中の特定の文字の数を出したい。
アクセス(Ver.2000)のテーブルの、一つのフィールド内に 色々な文字が並んでおります。 その中の特定の文字の数を数えたいのですが、クエリで数を出す方法は? 例えば 一行目のフィールドに『abc』 二行目のフィールドに『bcc』 という二つのレコードがあったとします。 上記をクエリで、 『a』→ 1 『b』→ 2 『c』→ 3 というように各文字の数を出したいのですが、 どのような方法で出せるでしょうか? 分かる方ご教授よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
■テーブルの作成 新たにテーブル「T_検索文字」を作ります。フィールドは「検索文字」の1フィールドのみで 内容は、アルファベット26文字について調べるならば、 検索文字 -------- a b :(中略) y z の26レコードです。 ■選択クエリの作成 次のSQL文をクエリのSQLビューでコピペして実行してみてください。 SELECT 検索文字, Sum(Len([フィールド名])-Len(Replace([フィールド名],[検索文字],""))) AS 数 FROM テーブル名, T_検索文字 GROUP BY 検索文字 HAVING Sum(Len([フィールド名])-Len(Replace([フィールド名],[検索文字],"")))>0; いかがでしょうか。
その他の回答 (3)
- karihone
- ベストアンサー率100% (1/1)
No.3の続きです。 SELECT "a" ではなく、 SELECT 検索文字 としてください。ここの 検索文字 というのは、テーブル「T_検索文字」に存在するフィールド名です。
お礼
出来ました!! SELECTの後ろのテーブルを間違えていたのですね! 本当に助かりました。 有難うございました!
- Gin_F
- ベストアンサー率63% (286/453)
> 今処理したい一つのフィールドには月単位分の文字列が入っており、 > (例えで出した「a~c」が7月だと31日分(31桁)あります) > 月によって日数(桁数)が変わるわけですから、 > 毎月クエリを修正しなければいけないということになりますね? > かなり辛いところです。 もう少し、詳細な仕様を提示していただければ、具体的なコード(VBA)を 回答することができるかもしれません。 テーブル構成 データ例 など。
お礼
お返事有難うございました。 VBAも勉強したいのですが、今回はなんとかSQL文で 出来ないものかと検討しております。 何かヒントがありましたらまたご教授ください。
- gatyan
- ベストアンサー率41% (160/385)
ベタで処理が遅くてもいいなら、1文字ずつバラしてunionで結合してcount() 多分、こんな感じでよかったと思いますが、未テスト!!! Unionクエリ…全文字をバラして羅列するクエリ…を作る select mid(フィールド,1,1) from テーブル union all select mid(フィールド,2,1) from テーブル union all select mid(フィールド,3,1) …桁数分繰り返す で、このクエリ結果を集計クエリでGroup化してCountをとると、とりあえずクエリだけで出せます。 でも、できるなら、VBAで組んだほうが処理はいいような気がします。
お礼
さっそくのお返事有難うございました。 ご回答して頂いた内容でいきますと、 今処理したい一つのフィールドには月単位分の文字列が入っており、 (例えで出した「a~c」が7月だと31日分(31桁)あります) 月によって日数(桁数)が変わるわけですから、 毎月クエリを修正しなければいけないということになりますね? かなり辛いところです。 レコードは8000レコードほどのテーブルですので、 処理時間もかなりかかりそうですね。 残念ながらVBAを組むほどのスキルもありませんので、途方に暮れております。 何かいい方法はないものでしょうか…。
お礼
お返事有難うございます。 さっそく試して見ました。 なんとか数字が出てきました。 式1という構文が勝手に出てきたのですが、これでよいのですね? SELECT "a" AS 式1, Sum(Len([InfoData])-Len(Replace([InfoData],"a",""))) AS 数 FROM Plan_dt, T_検索文字 GROUP BY "a" HAVING (((Sum(Len([InfoData])-Len(Replace([InfoData],"a",""))))>0)); ところで、複数の文字の数を一つのSQL文で出すことは出来るのですか? 「and」で繋いでSQL文を作ってみたのですが、 『SQLステートメントの後に文字が見つかりませんでした』というエラーになりました。 SELECT "a" AS 式1, Sum(Len([InfoData])-Len(Replace([InfoData],"a",""))) AS 数 FROM Plan_dt, T_検索文字 GROUP BY "a" HAVING (((Sum(Len([InfoData])-Len(Replace([InfoData],"a",""))))>0)); and SELECT "b" AS 式2, Sum(Len([InfoData])-Len(Replace([InfoData],"b",""))) AS 数 FROM Plan_dt, T_検索文字 GROUP BY "b" HAVING (((Sum(Len([InfoData])-Len(Replace([InfoData],"b",""))))>0)); 基本的なことが分からなくて申し訳ございません。 ご教授よろしくお願いします。