- ベストアンサー
クエリについて教えてください
ご存知の方がいたら教えてください。 今下記のようなデータがあります ABC 30 ABC 40 ABC 344 ABD 100 ABD 200 ABE 100 これを ABC 30 40 344 ABD 100 200 ABE 100 のように横展開した結果を出すにはクエリはどのように組んだらよいのでしょうか? 半日かけて悩んでますが、、結果が出ません。 童かよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
以前の回答からの引用が多くなりますが Mid 部分について > > sTmp = sTmp & "、" & rs("分類2") > 抽出された分類2を1つの文字列として作っていきます。 > 作られた文字列は、分類1="B" であった場合 > sTmp = "、1-1、1-2" となります。 > 関数の戻り値を設定する時、 > 1つでも分類2が抽出されていれば文字数は0以上となっていますが > 作った文字列先頭の "、" は不要なため、2文字以降ということで Mid(sTmp, 2) とします > ClassString = IIf(Len(sTmp) > 0, Mid(sTmp, 2), "") は分かりづらいですね。 以下の書き方と一緒です。 (こちらの方が処理は速いようです:確かではありませんが) If (Len(sTmp) > 0) Then ClassString = Mid(sTmp, 2) Else ClassString = "" End If > ※「ClassString」という名前は適宜変更してください。 > ネットでclassstringを調べたのですが、・・・ 「ClassString」という名前は、かってに命名した名前です。 標準モジュールに「ClassString」名で関数を作成したので、 クエリからその関数名で結果を得ようとしています。 標準モジュールに作成した関数名が「HogeHogeXX」なら、 クエリにも HogeHogeXX を記述することで関数の戻り値を利用できます。 回答番号3に記述した URL 内の回答4 にもう少し記述しています。 読んで、また分からなかったら 補足/お礼の欄に書いてください。
その他の回答 (4)
- 30246kiku
- ベストアンサー率73% (370/504)
以下の環境で再度試してみました。 Windows2000Pro + Access2000 Windows XP Pro + Access2003 Windows Vista + Access2007 正常動作を確認できました。 ただ、1つのファイル(mdb/accdb)で完結していた環境となります。 (パススルークエリでは使えない方法です) 確認した手順:Access2003での) ・テーブルサンプルのCSV化 テーブルサンプルをメモ帳にコピー 全角スペースを半角 , に置換 半角 ,, を , に置換( , が1つになるまで) 行先頭 , 削除 ファイルへセーブ ・Access を起動し、新規mdb作成 ・CSVファイルを指定テーブル名でインポート ・VBE起動 (メニューの「ツール」->「マクロ」->「Visual Basic Editor」) ・VBE画面で 参照設定の追加(メニューの「ツール」->「参照設定」) Microsoft ActiveX Data Objects 2.1 Library 標準モジュールの挿入(メニューの「挿入」->「標準モジュール」) Public Function ~ End Function 部分を貼り付け ・クエリの作成 「デザインビューでクエリを作成する」より、テーブル選ばず閉じるボタン SQLビューへ表示変更 表示されているものを消去し、提示SQLビュー内容を貼り付け 表示を「データシートビュー」にすると、結果が表示されるはずです。 ※「ClassString」という名前は適宜変更してください。 ※ なぜエラーとなったか、わかりませんでした。
お礼
本当にご丁寧にありがとうございます。 書いてある通りの手順で実行したところ、うまくいきました! が、どうしてもどうしても理解が追いつきません。。 つまりこれは、標準モジュールのほうでは、1件づつデータを読んでいて、"&sclass&"部分で、クエリのほうの実行結果を流用しているということなのでしょうか? また、STMPは、結果のテーブルを作っていて、 最後のmidはなにをしているのでしょうか?ここでもclassstring??? かなり混乱していてすみません。ネットでclassstringを調べたのですが、いまいち理解しきれず、再度質問してしまいました。 どうぞよろしくお願いしますm(_ _ )m
- 30246kiku
- ベストアンサー率73% (370/504)
ちょっと考えてみます。 (ただ、私に考えれるかどうか疑問もありますが、あまり期待しないでください) 追加回答できなかったらごめんなさい。 その間、ここでも読んでみてください。 http://www.kotaete-net.net/Default.aspx?pgid=14&qid=120502497066
- 30246kiku
- ベストアンサー率73% (370/504)
他で回答したものと同じなのですが参考になれば。 テーブル「T_分類」が以下のようになっている時(どちらもテキスト型) 分類1 分類2 A 1 B 1-1 B 1-2 C 1-A C 1-B C 1-C クエリ操作で 分類1 分類 A 1 B 1-1、1-2 C 1-A、1-B、1-C とする方法になります。 クエリのSQLビュー内容) SELECT [分類1], ClassString([分類1]) AS 分類 FROM T_分類 GROUP BY [分類1] ORDER BY [分類1]; 標準モジュールに記述する関数) Public Function ClassString(sClass As String) As String Dim rs As New ADODB.Recordset Dim sTmp As String sTmp = "" rs.Source = "SELECT [分類2] FROM T_分類 WHERE [分類1]='" & sClass & "' ORDER BY [分類2] ;" rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic While (Not rs.EOF) sTmp = sTmp & "、" & rs("分類2") rs.MoveNext Wend rs.Close ClassString = IIf(Len(sTmp) > 0, Mid(sTmp, 2), "") End Function > sTmp = sTmp & "、" & rs("分類2") 抽出された分類2を1つの文字列として作っていきます。 作られた文字列は、分類1="B" であった場合 sTmp = "、1-1、1-2" となります。 関数の戻り値を設定する時、 1つでも分類2が抽出されていれば文字数は0以上となっていますが 作った文字列先頭の "、" は不要なため、2文字以降ということで Mid(sTmp, 2) とします。
補足
丁寧に教えてくださってありがとうございます。 すごく初歩的なところで、わかっていないので、教えてください。。 上記にあるようなテーブルを作ってクエリを書いてモジュールも作成してみましたが、、そうしてクエリを実行すればうまくいく、というものでもないんでしょうか? エラーMSGとしては、クエリ式ClassString([分類1]のあいまいな名前です。と出ています。 クエリとモジュールの関係性がまだあまりわかっていないため、 質問がおかしかったらすみません。 どうぞよろしくお願いします。
- AKARI0418
- ベストアンサー率67% (112/166)
一列づつ3行出力するのがよいのではないでしょうか? SELECT データ FROM テーブル WHERE 名前='ABC'
お礼
ありがとうございます。 ですが、やはり、横展開のデータが必要なのです。。 ABC を "名前" 30 を"データ"とすると、 select 名前,データ from テーブル group by 名前 でやると、 ABCは1件だけが出力され、他のデータは消えてしまいますので、やはりgroup byは使えず・・。 というところで悩んでいるのです。 名前には何がはいってくるか未定なので、where句で直接聞くわけにもいかずです。 どうぞよろしくお願いします。
お礼
なるほどです。 (回答が遅くなってすみません!!) まだまだ勉強が足りないですが、 わかってくるととても楽しいです。^^ どうもありがとうございました。