• ベストアンサー

クエリについて教えてください

ご存知の方がいたら教えてください。 今下記のようなデータがあります ABC 30 ABC 40 ABC 344 ABD 100 ABD 200 ABE 100 これを ABC 30 40 344 ABD 100 200 ABE 100 のように横展開した結果を出すにはクエリはどのように組んだらよいのでしょうか? 半日かけて悩んでますが、、結果が出ません。 童かよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.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 にもう少し記述しています。 読んで、また分からなかったら 補足/お礼の欄に書いてください。

chelny
質問者

お礼

なるほどです。 (回答が遅くなってすみません!!) まだまだ勉強が足りないですが、 わかってくるととても楽しいです。^^ どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

以下の環境で再度試してみました。 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」という名前は適宜変更してください。 ※ なぜエラーとなったか、わかりませんでした。

chelny
質問者

お礼

本当にご丁寧にありがとうございます。 書いてある通りの手順で実行したところ、うまくいきました! が、どうしてもどうしても理解が追いつきません。。 つまりこれは、標準モジュールのほうでは、1件づつデータを読んでいて、"&sclass&"部分で、クエリのほうの実行結果を流用しているということなのでしょうか? また、STMPは、結果のテーブルを作っていて、 最後のmidはなにをしているのでしょうか?ここでもclassstring??? かなり混乱していてすみません。ネットでclassstringを調べたのですが、いまいち理解しきれず、再度質問してしまいました。 どうぞよろしくお願いしますm(_ _ )m

全文を見る
すると、全ての回答が全文表示されます。
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

ちょっと考えてみます。 (ただ、私に考えれるかどうか疑問もありますが、あまり期待しないでください) 追加回答できなかったらごめんなさい。 その間、ここでも読んでみてください。 http://www.kotaete-net.net/Default.aspx?pgid=14&qid=120502497066

全文を見る
すると、全ての回答が全文表示されます。
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

他で回答したものと同じなのですが参考になれば。 テーブル「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) とします。

chelny
質問者

補足

丁寧に教えてくださってありがとうございます。 すごく初歩的なところで、わかっていないので、教えてください。。 上記にあるようなテーブルを作ってクエリを書いてモジュールも作成してみましたが、、そうしてクエリを実行すればうまくいく、というものでもないんでしょうか? エラーMSGとしては、クエリ式ClassString([分類1]のあいまいな名前です。と出ています。 クエリとモジュールの関係性がまだあまりわかっていないため、 質問がおかしかったらすみません。 どうぞよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

一列づつ3行出力するのがよいのではないでしょうか? SELECT データ FROM テーブル WHERE 名前='ABC'

chelny
質問者

お礼

ありがとうございます。 ですが、やはり、横展開のデータが必要なのです。。 ABC を "名前" 30 を"データ"とすると、 select 名前,データ from テーブル group by 名前 でやると、 ABCは1件だけが出力され、他のデータは消えてしまいますので、やはりgroup byは使えず・・。 というところで悩んでいるのです。 名前には何がはいってくるか未定なので、where句で直接聞くわけにもいかずです。 どうぞよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 数学の面積比について

    下の画像の問題の式を作り、答えを出した結果、正解していたのですが何故、この様な式になるのか分かりません。 特に最後にかける所(※の所です)は何故、かけるのか分からないので詳しく教えて頂けると嬉しいです。 私の式を載せておきます。 △ABD=18/18+9=18/27=2/3△ABC △ABE=9/9+6=9/15=3/5△ABD ※△ABD=3/5×2/3=2/5 よって、2:5 宜しくお願い致します。

  • アクセス:レコード中の重複あたいを削除する方法

    100件のレコードがあります。フィールドAに4桁の一意なデータが入っています。フィールドBにはフィールドAの頭から3桁を抜き出したデータが入っています。 Aは一意でもBはそうではなくなる場合があり重複が発生します。この重複のデータのみを削除する方法を教えていただけないでしょうか。 フィールドA、 フィールドB ABC1、ABC ABC2、ABC ABD1、ABD ABD2、ABD どれぞれ二つ目のABCとABDを削除し、下記のようにしたい。 フィールドA、 フィールドB ABC1、ABC ABC2、 ABD1、ABD ABD2、

  • ACCESSのクエリで計算式の表し方

    クエリに下記のようなデータが入っています。 縦方向に計算するにはどのように式を表記したらいいのでしょうか?     あ列 い列 1行目  3  4 2行目  6  9 1行目の二乗と2行目の二乗を足した結果を表記する     ↓ あ列結果 い列結果  45   97

  • Accessでクエリを完了できません。と出ます。

    Access2007を使用しています。 OS:Windows7(64bit) CPU:Core i7 870@2.93GHz 3.07GHz 実装メモリ(RAM):8.00GB 少しデータ量はあるものの、あるクエリをテーブルにしようとすると下記のエラーが出ます。 「クエリを完了できません。クエリ結果のサイズがデータベースの最大サイズ(2GB)より大きいか、 クエリ結果を一時的に保存するディスクの空き容量が不足しています。」 と表示され、テーブルが作成できません。 少しデータを減らして実行されるとテーブルは作成でき、Accessの容量は96,372KBとなります。 この減らしたデータが残り2GB弱とは思えないので、処理中に一時保存する空き容量が不足 しているのかなと思いました。 どうすれば先へ進むことができるでしょうか? よろしくお願いします。

  • MS Accessクエリーの件>bin-chan

    先の続きです ↓ http://okwave.jp/qa/q7273347.html 以下についてですが、、 > A,B,Cいずれも合致していないデータはいくつあるのか? 表現があいまいですね。列Bのみ合致するものはどうすれば良いですか? ↓ できるのであれば、 ABC一致 AB一致 AC一致 BC一致 A一致 B一致 C一致 全て一致しない の全てを重複しない形で引っ張りたいです。 それを 以下のように符号をつけることにおいて、不一致クエリーでカバーできますか???? ↓ クエリの新規作成するときに「不一致クエリ ウィザード」で作成してから、デザインビューで構造を参照すると良いかも。 >また3つ合致しているデータにはそのレコードの横に列を新しく追加して1とふる、 >  2つ合致しているのはそのコードの横に列を新しく追加して2とふる >  1つ合致しているのはそのコードの横に列を新しく追加して1とふる >  0つ合しているのはそのレコードの横に列を新しく追加して0とふる、 このあたり差し支えなければもう少し詳しくお伺いできればと幸いです。 更新クエリーを活用しようと思っていたので、 ↓ デザイングリッドで、評価用列を3つ作って、それぞれでIIFを用い、条件一致すれば1を不一致なら0を返す列を設け、その結果3つを合計する列を表示すれば可能です。

  • Accessのクエリ実行について

    すみません。ご存知でしたら、教えてください。 まず一点、基本(?)を確認させてください。 下記のように数個のテーブルとそれらを使用した数個のクエリがあったとします。 下記の場合に、もしどれかのテーブルを更新したとします。 その場合、アクセスを立ち上げて、クエリ3を実行するだけで、結果には反映されているのでしょうか?それとも、アクセスを立ち上げて、 クエリ1を実行し閉じ、クエリ2を実行し閉じ、最後にクエリ3を実行しないと、反映されていないのでしょうか? --------------------------------------------------------- テーブルリンクA 、テーブルリンクB、テーブルリンクC、テーブルリンクD ↓↓ テーブルAとテーブルBでクエリ1(マッチング)を作成 テーブルCとテーブルDでクエリ2(マッチング)を作成 ↓↓ クエリ1とクエリ2でクエリ3(マッチング)を作成 ------------------------------------------------- 続いて、もし上記でいちいち途中のクエリを実行しないと、 最後のクエリに反映されない場合、すべてをACCESSを立ち上げたと同時に自動実行し、自動で最後のクエリ(この場合、クエリ3)をエクスポートしたいと考えています。可能でしょうか? 素人な質問ですみません。 何卒よろしくお願いいたします。

  • MS Accessクエリでのデータカウント

    アクセスで、大量のHPログデータを処理しようとしています。 1つのテーブルに http://www.a.co.jp/○/以下のカテゴリへの一か月分のアクセスデータをインポートしてあります。 これを、「(省略)/○/abc/」や「/○/bac/」など、それぞれのカテゴリ別に、アクセス数をカウントしたいのです。 それで、「/abc/*」、「/bac/*」と、それぞれカウントしたいカテゴリの名称・URL一覧を紐付け用のテーブルとして作成し、クエリを作成してみましたがうまくいきません。 データとURLが完全一致でない場合、どのようにクエリを作成するのかわからなくなっています。 初心者で、説明もままならないですがお分かりになられる方、教えてください。

  • クエリでのデータ更新について

    ACCESS2000で更新クエリの質問です。 フィールドの値の合計、カウントなどの集計値を計算するクエリから取り出された値を、更新クエリでデータを更新したいのですが、 「更新可能なクエリでありません」とエラーがでます。 LOOPする方法もあるのですが、できればクエリで一括更新したいと思います。 どなたかご教授お願いします。 やりたいことは下記のとおりです。Aテーブルを集計しBテーブルの個数にAテーブルの個数の合計値を更新する。 <Aテーブル> コード  個数 1     1 1     2 1     3 2     4 2     4 3     5 3     6 <Bテーブル> コード  個数 1      2      3    ↓↓↓更新後 <結果:Bテーブル>   コード  個数 1     6 2     8 3     11

  • アクセス・選択クエリについて

    アクセス・選択クエリについて こんにちは。現在、選択クエリについて悩んでおります。 テーブルAとテーブルBからそれぞれ3つのフィールドを選び、選択クエリを作成。しかし、出来上がったクエリのデータシートには一切データが表示されていません。ならばと思い、テーブルAからだけ3つのフィールドを選びクエリを表示させると、きちんと表示します。テーブルA,テーブルBには当然主キーが設定されていますが、その事と関係するのでしょうか?ご存知の方、どうか教えてください。宜しくお願い致します。

  • 集計クエリについて

    注文データ ・注文番号(重複なし) 商品テーブル ・商品コード ・商品名 実績1 ・注文番号 ・商品コード ・出庫日 ・使用重量 実績2 ・注文番号 ・商品コード ・出庫日 ・使用重量 上記4つのテーブルがあり、それぞれ下記の内容が入っています。 注文データ A01 A02 A03 A04 商品テーブル S01 あずき S02 いちご S03 りんご 実績1 A01 S01 2015/9/1 10.00 A02 S02 2015/9/2 10.00 A04 S01 2015/9/4 10.00 実績2 A01 S01 2015/9/1 10.00 A03 S03 2015/9/3 10.00 A04 S01 2015/9/4 10.00 クエリを使用して実績1と実績2を下記のように集計するにはどのようにしたら良いでしょうか。 一つのクエリ内で処理したいです。 集計クエリ結果 S01 あずき 20.00 S02 いちご 10.00 S03 りんご 10.00

専門家に質問してみよう