アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセス(Ver.2000)のテーブルの、一つのフィールド内に
色々な文字が並んでおります。
その中の特定の文字の数を数えたいのですが、クエリで数を出す方法は?


例えば

一行目のフィールドに『abc』
二行目のフィールドに『bcc』

という二つのレコードがあったとします。

上記をクエリで、
『a』→ 1
『b』→ 2
『c』→ 3
というように各文字の数を出したいのですが、
どのような方法で出せるでしょうか?


分かる方ご教授よろしくお願いします。

A 回答 (4件)

ベタで処理が遅くてもいいなら、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で組んだほうが処理はいいような気がします。
    • good
    • 0
この回答へのお礼

さっそくのお返事有難うございました。

ご回答して頂いた内容でいきますと、
今処理したい一つのフィールドには月単位分の文字列が入っており、
(例えで出した「a~c」が7月だと31日分(31桁)あります)
月によって日数(桁数)が変わるわけですから、
毎月クエリを修正しなければいけないということになりますね?
かなり辛いところです。

レコードは8000レコードほどのテーブルですので、
処理時間もかなりかかりそうですね。

残念ながらVBAを組むほどのスキルもありませんので、途方に暮れております。
何かいい方法はないものでしょうか…。

お礼日時:2006/07/16 00:18

> 今処理したい一つのフィールドには月単位分の文字列が入っており、


> (例えで出した「a~c」が7月だと31日分(31桁)あります)
> 月によって日数(桁数)が変わるわけですから、
> 毎月クエリを修正しなければいけないということになりますね?
> かなり辛いところです。

もう少し、詳細な仕様を提示していただければ、具体的なコード(VBA)を
回答することができるかもしれません。

テーブル構成
データ例

など。
    • good
    • 0
この回答へのお礼

お返事有難うございました。
VBAも勉強したいのですが、今回はなんとかSQL文で
出来ないものかと検討しております。
何かヒントがありましたらまたご教授ください。

お礼日時:2006/07/16 13:32

■テーブルの作成


 新たにテーブル「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;

 いかがでしょうか。
    • good
    • 0
この回答へのお礼

お返事有難うございます。

さっそく試して見ました。
なんとか数字が出てきました。
式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));



基本的なことが分からなくて申し訳ございません。
ご教授よろしくお願いします。

お礼日時:2006/07/16 13:39

No.3の続きです。


SELECT "a"
ではなく、
SELECT 検索文字
としてください。ここの
検索文字
というのは、テーブル「T_検索文字」に存在するフィールド名です。
    • good
    • 0
この回答へのお礼

出来ました!!
SELECTの後ろのテーブルを間違えていたのですね!
本当に助かりました。
有難うございました!

お礼日時:2006/07/16 17:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!