• ベストアンサー

重複した複数データを一つのレコードに結合するには?

No| 製品| 金額| 10| 鉛筆|100| 10| のり| 50| 20| 鉛筆|100| 30|絵の具|300| 30|ノート|150| 30| 定規| 80| 30|ハサミ|500|      ↓ No|製品1|金額1|製品2|金額2|製品3|金額3|製品4|金額4|製品5|金額5| 10| 鉛筆|100| のり| 50|   |   |   |   |   |   | 20| 鉛筆|100|   |   |   |   |   |   |   |   | 30|絵の具|300|ノート|150| 定規| 80|ハサミ|500|   |   | (Noと金額は半角です。) のようにデータを結合したいのです。(一つのフィールドに一つの製品、金額) 製品、金額は1から順番に左詰にします。 結果はレポートではなくテーブルで・・・ クエリーで簡単に処理したいのですが、無理ならモジュールで記述してもOKです。 使用しているデータベースソフトはAccess2000です。 実際凄く困っています。できれば早急にご返事いただければ幸いです。 よろしくm(._.)mお願いします。

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

  • ベストアンサー
  • klub
  • ベストアンサー率36% (14/38)
回答No.4

モジュールでやるとこんな感じです。 DoCmd.RunSQL "DELETE T_結合.* FROM T_結合;" Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim RS2 As ADODB.Recordset Dim 退避ナンバー As Long Dim カウント As Integer Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset Set RS2 = New ADODB.Recordset RS.CursorLocation = adUseClient RS.Open "T_製品", CN, adOpenKeyset, adLockOptimistic RS2.Open "T_結合", CN, adOpenKeyset, adLockOptimistic RS.Sort = "ナンバー ASC" RS.MoveFirst カウント = 1 Do Until RS.EOF 退避ナンバー = RS!ナンバー RS2.AddNew RS2!ナンバー = RS!ナンバー Do Until 退避ナンバー <> RS!ナンバー RS2("製品" & カウント) = RS!製品 RS2("金額" & カウント) = RS!金額 カウント = カウント + 1 RS.MoveNext If RS.EOF Then Exit Do Loop RS2.Update カウント = 1 Loop RS.Close RS2.Close CN.Close End Sub テーブルは下記状況で作成しました。 ・T_製品  ナンバー 数値型   製品   テキスト型  金額   通貨型 ・T_結合  ナンバー 数値型   製品1   テキスト型  金額1   通貨型      :      :  製品10   テキスト型  金額10   通貨型 上記モジュールを何かのイベントで動かしてください。 (クリック時とか) モジュール以外で自動で行うのは結構大変かも。

mogmogmog
質問者

お礼

ありがとうございました。うまくでき、今後の参考にもなり勉強にもなりました。 >Set CN = CurrentProject.Connection >Set RS = New ADODB.Recordset >Set RS2 = New ADODB.Recordset >RS.CursorLocation = adUseClient >RS.Open "T_製品", CN, adOpenKeyset, adLockOptimistic >RS2.Open "T_結合", CN, adOpenKeyset, adLockOptimistic >RS.Sort = "ナンバー ASC" >RS.MoveFirst >カウント = 1 >Do Until RS.EOF    ↑ ちょっと意味がわからないのですが・・・

その他の回答 (4)

  • stork
  • ベストアンサー率34% (97/285)
回答No.5

長いですが動作確認済みです、以下のクエリでどうでしょうか。 -------------------------------------------- select [No] ,max(製1) as 製品1 ,max(金1) as 金額1 ,max(製2) as 製品2 ,max(金2) as 金額2 ,max(製3) as 製品3 ,max(金3) as 金額3 ,max(製4) as 製品4 ,max(金4) as 金額4 ,max(製5) as 製品5 ,max(金5) as 金額5 ,max(製6) as 製品6 ,max(金6) as 金額6 ,max(製7) as 製品7 ,max(金7) as 金額7 ,max(製8) as 製品8 ,max(金8) as 金額8 ,max(製9) as 製品9 ,max(金9) as 金額9 ,max(製10) as 製品10 ,max(金10) as 金額10 into [結果テーブル] from (select [No] ,iif([順序]=1,[製品],null) as 製1 ,iif([順序]=1,[金額],null) as 金1 ,iif([順序]=2,[製品],null) as 製2 ,iif([順序]=2,[金額],null) as 金2 ,iif([順序]=3,[製品],null) as 製3 ,iif([順序]=3,[金額],null) as 金3 ,iif([順序]=4,[製品],null) as 製4 ,iif([順序]=4,[金額],null) as 金4 ,iif([順序]=5,[製品],null) as 製5 ,iif([順序]=5,[金額],null) as 金5 ,iif([順序]=6,[製品],null) as 製6 ,iif([順序]=6,[金額],null) as 金6 ,iif([順序]=7,[製品],null) as 製7 ,iif([順序]=7,[金額],null) as 金7 ,iif([順序]=8,[製品],null) as 製8 ,iif([順序]=8,[金額],null) as 金8 ,iif([順序]=9,[製品],null) as 製9 ,iif([順序]=9,[金額],null) as 金9 ,iif([順序]=10,[製品],null) as 製10 ,iif([順序]=10,[金額],null) as 金10 from (SELECT (select count(*) from tableA as Sub where main.no = sub.no and main.製品>sub.製品)+1 AS 順序 ,* FROM tableA AS Main) as tableB) as tableC group by [No] ----------------------------------------- 3つのクエリを無理やりひとつにしています。 レスポンスが悪い場合は適宜分割してください。 結果の列数は製品10までの固定です。列が可変の場合はAccessのクエリでは無理ですね(たぶん)。

mogmogmog
質問者

お礼

ありがとうございました。クエリでもこんなやり方ができるのですね。 いろいろと教えていただき大変助かりました。

  • stork
  • ベストアンサー率34% (97/285)
回答No.3

再びstorkです。遅くなってすみません。 テーブルが100件程度で、結果の列数も固定だと言うことで、テーブルに製品番号カラムを追加し、番号を手作業で振って、結果テーブルにinsertしていくのはいかかがでしょうか。 順を追って説明すると、 1.テーブルに列を追加。列名:製品番号 2.列:製品番号に番号を振る。(製品1なら1) 3.結果セットを入れるテーブルを作る 4.結果テーブルにナンバーを振っておく 5.更新クエリを使用して結果セットに値を入れる。  SQLはこんな感じ  update tableA inner join tableB on tableA.No = tableB.No set tableB.製品1 = tableA.製品 tableB.金額1 = tableA.金額  where tableA.製品番号 = 1 これを番号を変えて10回実行する。 面倒臭いですかね.....。 モジュールを記述するより簡単だと思いますが。

mogmogmog
質問者

お礼

解答ありがとうございます。 番号を手作業で振るということですが、処理を自動化にしたいので自動的に番号を振る方法はないですか?(すいません私の説明が不足していたようで・・・)

  • stork
  • ベストアンサー率34% (97/285)
回答No.2

お力になれるかどうか分かりませんが、考えてみますので、以下のことを教えて下さい。  1.テーブルの主キー  2.テーブルのおおよその件数  3.結果例の列は、製品5まであるが、固定か可変か。また、おおよその列数はどれくらいか

mogmogmog
質問者

お礼

ありがとうございます。  1.【NO】です。  2.件数は決まっていないのではっきりとした件は言えませんが100件未満  3.列数は10ぐらいで固定です。 宜しくお願いします。

  • msystem
  • ベストアンサー率42% (79/186)
回答No.1

Accessならばクロス集計クエリというのがあります。 これなら、希望されていることができると思います。 結果はテーブルでというのが気になりますが、参照ならクエリでは・・・ テーブルにしたいのであれば、それにさらに、テーブルを作成するモジュールを組み合わせ、追加クエリでということになると思います。

mogmogmog
質問者

お礼

早速のご回答ありがとうございます。 ですが、以前クロス集計したらうまくできませんでした。 どの項目を行見出し、列見出し、値と指定するか詳しく教えてくださると助かります。宜しくお願いします。

関連するQ&A

  • 複数のレコードにデータを追加する

    ACCESS2000でシステムを構築中しているのですが、 わからないことがあるのでご教授ください。 テーブル1 ID、名前 テーブル2 ID、基本ID、月、金額 リレーションシップ 1、ID→2、基本ID(1対多 結合プロパティ2) フォーム ID、名前、月、金額 フィルターでコンボボックスに指定した月のデータのみ表示される仕様です。 私がやりたいのは、1テーブルの全員のレコードに追加クエリーで5月なら5(Value)を入れたいのです。ID、名前は、登録したときのものを使います。 山本 3月 \1000 山本 4月 \500 宮本 2月 \1200 宮本 3月 \1000 宮本 4月 \1300 秋田 3月 \1400 秋田 4月 \900 ↓ 山本 5月 宮本 5月 秋田 5月 山本、宮本、秋田の月フィールドに5月を入れたいのですが、どうやれば上記のようなことができるでしょうか? 私の中では、選択クエリーと追加クエリーの組み合わせを考えたのですが、とてもむずかしいです。

  • ACCESS2003クエリの結合した表示形式が

    ACCESS2003でクエリを作成しました。各テーブルのフィールドを結合したのですが 表示形式が思ったようになりませんでした。 【Aテーブル】 フィールド:学部NO データ型:数値型 書式:00 【Bテーブル】 フィールド:学科NO データ型:数値型 書式:00 【ABクエリ】 フィールド:学籍NO:[Aテーブル]![学部NO]&[Bテーブル]![学科NO] 【ABクエリ】の結果が数字が4桁表示されません。 (例) 0101 と表示してほしいのですが、   11  と表示されます。 各テーブルでは、01と表示されるのですが・・・。 宜しくお願いします。

  • Accessを使って複数データをまとめたい

    エクセルの2つのシート、A店の売上データ、B店の売上データを一つのシートにまとめて 且つ、売上金額を商品ごとにまとめ、商品コードの一覧表に紐づけたいのですが やり方が分からずにいます。(データをインポートして都度使えるようにしたいのですが) A店売上データ えんぴつ 2本 200円 消しゴム 1個  100円 ものさし 3個  30円 ・ ・ ・ B店売上データ えんぴつ 1本 100円 消しゴム 1個  100円 のり   2個  20円 ・ ・ ・ (1)この2つのデータをまずは下記のようにまとめたい えんぴつ 3本 300円 消しゴム 2個  200円 ものさし 3個  30円 のり   2個  20円 ・ ・ ・ (2)次に商品コードのあるシートと紐づけしたい 商品コード 商品 購入数 合計金額 A252 えんぴつ 3本  300円 C300 消しゴム 2   200円 GH01 ものさし 3   30円 XX01 のり   2     20円 ・ ・ ・ A店売上データ B店売上データ 商品コードのあるデータシートは それぞれテーブルを作りましたが(テーブルが3つある状態) リレーションをどう組んで そのあと、追加クエリかユニオンクエリにしたほうがいいのか悩んでます。 また、A店売上データ、B店売上データを 組んでひとつにまとめたクエリをテーブルにして 商品コードのあるテーブルと紐づけたいと思いましたが やり方があまりわかりません。 作業自体はさほど難しくなさそうに感じるのですが やり方が飲み込めないでいます。 すみませんが、わかりやすく教えていただけると大変助かります。 教えて頂けますようお願いいたします。  

  • Accessの外部結合プロパティについて

    windows2000の環境で、Access2000を使用しています。 中古車在庫管理というデータベースを作成するという問題集をといています。 在庫マスターと商談リストという2つのテーブルがあります。 2つのテーブルは在庫NOで結合されています。 ”1度も商談にあがっていない在庫を抽出できるようにクエリーを作成する。と いう問題をといています。不一致クエリーウィザードで作成すれば、商談にあ がっていない、在庫だけを抽出することができましたが、 外部結合プロパティで実行すると、商談にあがったものと、あたっていないも の両方が抽出されてしまいます。 ちなみに、結合プロパティダイアログで、3つ選択肢があるなかの、”2.在 庫マスターの全レコードと商談リストの同じ結合フィールドのレコードだけを 含める”を選択しました。 外部結合プロパティで不一致クエリーウィザードと同じ結果を得ることはでき ないのでしょうか? どなたかご存知の方教えてください。

  • 複数のクエリを結合して実行したら・・・

    アクセス2000で行き詰まっています。月報を作成します。 テーブルは 1.日付 2.原料の受入(3社) 3.原料の使用 4.製品出来高4つです。 それぞれをクエリを作成して別に日付と結合しました。結合プロパティは抽出した期間の日付の全レコードと同じ結合フィールドの[受入日][使用日][出来高日]のレコードが表示されるように設定しました。 ところが、原料のLOT・使用量が同じ使用日に複数あると原料の受入や製品の出来高も複数行(同一日・同一量)表示されます。この結果を月別にレポートにしたいのですが、上のデータと同一なら非表示に設定できますか?教えてください。

  • SQL 外部結合について

    EXCELでODBC接続で外部データを取り込み、クエリテーブルを作成するところまではできるのですが、MicrosoftQueryを使って外部結合をしようとすると、テーブルが3個以上ある場合は外部結合できませんとエラーが表示されます。 直接SQLをさわれば出来るのかと思い、 SELECT フィールド名1, フィールド名2, ... FROM (((TABLE1 LEFT JOIN TABLE2 ON TABLE1.NO = TABLE2.NO)LEFT JOIN TABLE3 ON TABLE1.NO = TABLE3.NO)LEFT JOIN TABLE4 ON TABLE1.NO = TABLE4.NO)LEFT JOIN TABLE5 ON TABLE1.NO = TABLE5.NO を入力したのですが、「ORA-00942: 表またはビューが存在しません」というエラーが発生しました。 いろいろ調べてみたのですが全くの初心者なもので本当に困っております。 どなたかアドバイス等よろしくお願いします。

  • MySQLテーブルの結合

    MySQLテーブルの結合 select フィール名(field1,field2,field3)from xテーブル名 [inner/left/right] join yテーブル名 on 結合条件 解説書には説明されています 現在自分のデータベースは ahogedb(テーブル名) no hoge1 hoge2 bhogedb(テーブル名) no ahogeno(ahogedbのnoを登録) hoge3 ahogedbを表示してbhogedbでの訪問回数を表示させたいのです bhogedbのahogenoにはahogedbのnoが逐次登録されています 表示はno,hoge1,hoge2に追加したahogenoのカウント数 select文の式の書き方を出来れば1列にして教えてください ahogenoは別名の変数処理するのでしょうか

    • ベストアンサー
    • MySQL
  • アクセス フィールド・テーブルの結合について

    始めましてアクセス・データベース初心者です。 簡単な質問でしたら申し訳ございませんが 出来る限り分かり易く解答して頂けますと嬉しく思います。 テーブルの中に同じ値のフィールドを持つレコードがあり、 その同一フィールドでまとめて表示したいと思いますが どのようにすればよいか分かりません。 下記に例を表示致しますのでご参考にして頂ければと思います。 ID 品番 金額 111 AAA 1000円 111 BBB 150円 222 ZZZ 300円 このようなデータを下のようなデータに直したいです。 ID 品番1 金額1 品番2 金額2 品番3 ・・・ 111 AAA 1000円 BBBB 150円 ・・・ 222 ZZZ 300円 見にくいと思いますので例の画像も添付させて頂きます。 整理後のフィールドは品番1~品番6・金額1~金額6まで作る予定です。 品番や金額の種類は多数あります。 クロス集計クエリでするのかユニオンクエリというのを使うのかといところまでは調べたのですが、両方イマイチよく分かりません。 かなり困っていますのでどうかお助け下さいませ(泣)。

  • NULLを含む文字列の結合で困っています。

    いつもお世話になっています。 VB.NET2003+Access2000環境です。 まず前提として、このデータベースにはユニークなフィールドがありません。(残念ながらこちらの都合では変更することはできません) 従って今まではAccessのクエリウイザードを使って文字列を結合(フィールドを結合)して、ユニークなキーを作っていました。 これを今回、VB.NETで動いているアプリの中にボタンを作り、そこからcsvファイルにエクスポートさせるような仕掛けを作ろうとしました。 ところが、あるフィールドがデータが存在したりNULLであったりするため、結合するとNULLになるデータが出現してきます。 (Accessでは結合時、NULLは無視されていたようで影響はありませんでした) これでは検索して絞り込むキーには出来ず、Accessと同じ結果が得られません。 SQL文では(というかデータアダプターに読み込ませるクエリデザイナ作成時に)どういう風に記述すればNULLがあっても区別出来るようになるのでしょうか? 簡単に言えば フィールドA と フィールドB ともにテキストタイプのデータで、BのみNULLもあり得る場合、  select a, b, a+b as tempAB from tableC というSQL文を実行した結果、tempAB が NULL だけにならない方法をご教示ください。 SELECT CASE when~end などをいろいろ試してみましたがダメでした。 よろしくお願いいたします。

  • ACCESSユニオンクエリでORDER BYエラー

    お世話になります。 クエリAとBがあり、それぞれのクエリでは製品コードの先頭6文字(製品コード先頭6文字: Left([マスター]![製品コード],6))の昇順で並び替えしてます。 個々のクエリでは問題なく並び替えされるのですが、この二つのクエリをユニオンクエリで結合するとエラーとなってしまいます。 『ORDER BY 式 (Left([マスター]![製品コード],6))にクエリに選択されていないフィールドが含まれています。ORDER BY 式 (Left([マスター]![製品コード],6))に含めることができるのは、最初のクエリで要求されたフィールドだけです。』 となります。 調べたところ、『ユニオン クエリで使用されるテーブルにおいて、1 つ以上のフィールド名を変更した場合に発生します。 』ということでした。 http://support.microsoft.com/kb/282322/ja 確かに、それぞれのクエリでフィールド名を変更しているのですが・・・このような場合、どのようにすればうまく結合できるのでしょうか。それとも不可能なのでしょうか。。 以上、よろしくお願い致します。