Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


343 / 2272 ツリー ←次へ | 前へ→

【12074】データの統合 snbtkmt 11/9/6(火) 22:20 質問[未読]
【12078】Re:データの統合 nonon 11/9/15(木) 15:26 発言[未読]
【12081】Re:データの統合 snbtkmt 11/9/17(土) 1:09 発言[未読]
【12085】Re:データの統合 nonon 11/9/22(木) 14:17 発言[未読]
【12086】Re:データの統合 nonon 11/9/22(木) 14:40 発言[未読]

【12074】データの統合
質問  snbtkmt  - 11/9/6(火) 22:20 -

引用なし
パスワード
   AテーブルをBテーブルのように店名で統合する記述が下記にありますが
Aテーブルのフィールドを店名、商品1、商品2・・商品100にし
Bテーブルのフィールドを店名、商品1、商品2・・商品999にしたい場合
どこをどのように直せばいいか教えていただけますでしょうか?
宜しくお願いいたします。

Aテーブル
 店名  | 商品 |
 A店  |リンゴ |
 A店  |トマト |
 A店  |ナシ  |
 B店  |リンゴ |
 B店  |みかん |

Bテーブル

店名  |商品1 |商品2 |商品3 |商品4 |
A店  |リンゴ |トマト |ナシ  |   |
B店  |リンゴ |みかん |    |   |

--------------------------------------------------------------------
Function TEST02()
  
  Dim Rec01 As DAO.Recordset
  Dim Sql_Str As String
  Dim ShopName As String
  Dim Shouhin(4) As String
  Dim F_Number As Integer
  Dim i As Integer
  Dim Insert_Str As String
  
  'DoCmd.RunSQL で確認メッセージが出ないようにする
  DoCmd.SetWarnings False
  
  '現在のBテーブルのデータをすべて削除する
  DoCmd.RunSQL "DELETE * FROM Bテーブル;"
  
  Sql_Str = "SELECT * FROM Aテーブル ORDER BY 店名, 商品;"
  Set Rec01 = CurrentDb.OpenRecordset(Sql_Str, dbOpenForwardOnly)
  
  'フィールドの数の上限を入れておく
  F_Number_Max = 4
  
  'ShopName にとりあえずありえないデータを入れておく
  ShopName = "XXX"
  F_Number = 1
  
  For i = 1 To F_Number_Max
    Shouhin(i) = ""
  Next i
  
  Do Until Rec01.EOF
    '最初のレコードではない または 店名が変わったら
    If ShopName <> "XXX" And ShopName <> Rec01!店名 Then
      'INSERT文を作る
      Insert_Str = ""
      
      For i = 1 To F_Number_Max
        If Shouhin(i) <> "" Then
          Insert_Str = Insert_Str & ", '" & Shouhin(i) & "'"
        Else
          Insert_Str = Insert_Str & ", Null"
        End If
      Next i
      
      'Bテーブルにデータを追加
      DoCmd.RunSQL "INSERT INTO Bテーブル" & _
        "(店名, 商品1, 商品2, 商品3, 商品4) " & _
        "VALUES('" & ShopName & "'" & Insert_Str & ");"
      
      F_Number = 1
      
      For i = 1 To F_Number_Max
        Shouhin(i) = ""
      Next i
      
    End If
    
    ShopName = Rec01!店名
    
    '万が一上限の数を超えてしまったら Shouhin への代入は行わない
    If F_Number <= F_Number_Max Then
      Shouhin(F_Number) = Rec01!商品
      F_Number = F_Number + 1
    End If
    
    Rec01.MoveNext
  Loop
  
  Rec01.Close
  
  '最初のレコードではない(最後の店名の分を処理する)
  If ShopName <> "XXX" Then
    'INSERT文を作る
    Insert_Str = ""
    
    For i = 1 To F_Number_Max
      If Shouhin(i) <> "" Then
        Insert_Str = Insert_Str & ", '" & Shouhin(i) & "'"
      Else
        Insert_Str = Insert_Str & ", Null"
      End If
    Next i
    
    'Bテーブルにデータを追加
    DoCmd.RunSQL "INSERT INTO Bテーブル" & _
      "(店名, 商品1, 商品2, 商品3, 商品4) " & _
      "VALUES('" & ShopName & "'" & Insert_Str & ");"
    
    F_Number = 1
    
    For i = 1 To F_Number_Max
      Shouhin(i) = ""
    Next i
    
  End If
  
  '確認メッセージが出るようにする
  DoCmd.SetWarnings True
  
End Function

【12078】Re:データの統合
発言  nonon  - 11/9/15(木) 15:26 -

引用なし
パスワード
   ▼snbtkmt さん:

はじめまして、nononです。

レスがつきませんね。。。

ご質問内容は、AテーブルをBテーブルみたくできれば良いということですか?
そうであれば、アドバイスになるか分かりませんが、以下SQLでもできるので一応投稿します。
以下を基に装飾してみてください。

ちなみに、MAX行をLOOPにし、商品あるだけ回せば100も999もいけるはず。。。
ただ、レスポンスはどうかわからないです。。。

SELECT
  店名, 
  MAX( CASE 商品 WHEN 'メラ' THEN 商品 ELSE NULL END ) AS 商品1 ,
  MAX( CASE 商品 WHEN 'ギラ' THEN 商品 ELSE NULL END ) AS 商品2 ,
  MAX( CASE 商品 WHEN 'イオ' THEN 商品 ELSE NULL END ) AS 商品3
FROM
  Aテーブル
GROUP BY
  店名

【12081】Re:データの統合
発言  snbtkmt  - 11/9/17(土) 1:09 -

引用なし
パスワード
   はじめまして、nonon様
ご投稿いただき、ありがとうございます。
ご親切な内容で大変感謝しております。

この'メラ'や'ギラ'に入るのはリンゴやトマトになるのでしょうか?
それとも、A店やB店になるのでしょうか?
こちらの知識不足で申し訳ございませんが、教えていただけますと幸いです。
またどちらに装飾するにしても、エラーになってしまいました。
エラー内容は下記のとおりです。

「クエリ式' MAX(CASE 商品 WHEN 'メラ'THEN 商品 ELSE NULL END)'の構文エラー:演算子がありません。」

今一度お知恵を拝借させていただきたく投稿させていただきました。
何卒宜しくお願い申し上げます。

【12085】Re:データの統合
発言  nonon  - 11/9/22(木) 14:17 -

引用なし
パスワード
   ▼snbtkmt さん:

返信が遅くなってしまいすみませんでした。
そして、私が書いた構文に間違いがありました・・・すみません。

case文は使用できなく、クエリではSwitch文の使用でした。

または、クロス集計など如何でしょうか。
例えば、Aテーブルに商品コードのような項目を用意し、
以下のSQLでクロス集計を作成。
(AテーブルをExcelに落とし、フィルタなどをかけ商品コード付与)

■Aテーブル
店名 商品名 商品コード
A店  リンゴ 1
A店  トマト 2
A店  ナシ  3
B店  リンゴ 1
B店  みかん 4

■SQL
TRANSFORM Max(商品.[商品名]) AS 商品名の最大
SELECT 商品.[店名]
FROM 商品
GROUP BY 商品.[店名]
PIVOT 商品.[商品コード]
        ↑
商品コードを追加しなくて、ココを商品名でもOKですが、列名が・・・。

■追伸
「縦持ち 横持ち」などで検索すると色々と参考情報を
得る事ができますので、一度確認してみてください。

また、大した回答ができずすみません。
最初に投稿のあったスクリプトも拝見しておきますね。

【12086】Re:データの統合
発言  nonon  - 11/9/22(木) 14:40 -

引用なし
パスワード
   あぁ・・・これ私の勘違いかも。。。


えっと、
>Aテーブルのフィールドを店名、商品1、商品2・・商品100にし
>Bテーブルのフィールドを店名、商品1、商品2・・商品999にしたい場合
の意味ってどういう事でしょうか。

現時点では、Aテーブルには店名と商品という項目があると思いますが、
Aテーブルの項目はそうではなく、「店名、商品1、商品2・・商品100」
となっているという事でしょうか。

スクリプト拝見させて頂いたところ、一応はAテーブルからBテーブルを
作成できているとは思いますが、MAXで商品999を想定した場合、
どのように組みなおせば良いかという事でしょうか。

上記の場合、例えば、Bテーブルをスクリプト上で動的に作成する方法
などがあると思います。

Aテーブルの店名毎にカウントをとってそのMAXが「商品xxx」にあたい
しますので、そこでその情報を基にBテーブルのCreateを行い、Insert
していけば良いかと思います。

解釈、、、合っていますでしょうか。

343 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078190
(SS)C-BOARD v3.8 is Free