OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.151799
  • 閲覧数346
  • ありがとう数6
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 100% (5/5)

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お願いします。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル8

ベストアンサー率 36% (14/38)

モジュールでやるとこんな感じです。
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

お礼率 100% (5/5)

ありがとうございました。うまくでき、今後の参考にもなり勉強にもなりました。

>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

   ↑
ちょっと意味がわからないのですが・・・
投稿日時 - 2001-10-25 22:14:27
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル10

ベストアンサー率 42% (79/186)

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

お礼率 100% (5/5)

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


  • 回答No.2
レベル11

ベストアンサー率 34% (97/285)

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

お礼率 100% (5/5)

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

宜しくお願いします。
投稿日時 - 2001-10-17 00:14:51
  • 回答No.3
レベル11

ベストアンサー率 34% (97/285)

再びstorkです。遅くなってすみません。 テーブルが100件程度で、結果の列数も固定だと言うことで、テーブルに製品番号カラムを追加し、番号を手作業で振って、結果テーブルにinsertしていくのはいかかがでしょうか。 順を追って説明すると、 1.テーブルに列を追加。列名:製品番号 2.列:製品番号に番号を振る。(製品1なら1) 3.結果セットを入れるテーブルを作る 4.結果テーブルにナンバ ...続きを読む
再び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

お礼率 100% (5/5)

解答ありがとうございます。
番号を手作業で振るということですが、処理を自動化にしたいので自動的に番号を振る方法はないですか?(すいません私の説明が不足していたようで・・・)
投稿日時 - 2001-10-21 19:01:42
  • 回答No.5
レベル11

ベストアンサー率 34% (97/285)

長いですが動作確認済みです、以下のクエリでどうでしょうか。 -------------------------------------------- select [No] ,max(製1) as 製品1 ,max(金1) as 金額1 ,max(製2) as 製品2 ,max(金2) as 金額2 ,max(製 ...続きを読む
長いですが動作確認済みです、以下のクエリでどうでしょうか。
--------------------------------------------
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

お礼率 100% (5/5)

ありがとうございました。クエリでもこんなやり方ができるのですね。
いろいろと教えていただき大変助かりました。
投稿日時 - 2001-10-25 22:17:59
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ