プロが教えるわが家の防犯対策術!

どなたか教えて下さい。

Aテーブルに、(1)コード (2)No というフィールドがあります。
例)
(1)   (2)
1111  1
1112  2
1113  3
1111  4
この内容を、別テーブルに、
(1)コード (2)
1111   1,4
1112 2
1113 3
と、同一コードであれば、(2)フィールドにカンマ付きで全て
表示したいのです。

どなたか、お知恵をお貸し下さい。
よろしくおねがいいたします。

A 回答 (4件)

データベース関数などと命名した標準モジュールに以下の関数をコピペして保存して下さい。


次に、イミディエイトウインドウでテストして頂ければ幸いです。

[イミディエイト]
? DBSelect("SELECT F2 FROM A WHERE F1=1111")
1;4
? DBSelect("SELECT F2 FROM A WHERE F1=1111", " And ")
1 And 4 And

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional ByVal strSeparator As String = ";") As String
On Error GoTo Err_DBSelect
  Dim I   As Integer
  Dim J   As Integer
  Dim R   As Integer
  Dim C   As Integer
  Dim M   As Integer
  Dim N   As Integer
  Dim rst  As ADODB.Recordset
  Dim fld  As ADODB.Field
  Dim Datas As String
  
  Set rst = New ADODB.Recordset
  ' =================
  ' Begin With: rst
  ' -----------------
  With rst
     .Open strQuerySQL, _
        CurrentProject.Connection, _
        adOpenStatic, _
        adLockReadOnly
     If Not .BOF Then
      M = .RecordCount - 1
      N = .Fields.Count - 1
      .MoveFirst
      For R = 0 To M
        For C = 0 To N
          Datas = Datas & .Fields(C) & strSeparator
        Next C
        .MoveNext
      Next R
     End If
  End With
  ' ---------------
  ' End With: rst
  ' ===============
Exit_DBSelect:
  DBSelect = Left(Datas, Len(Datas) + (Len(Datas) > 0))
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function
    • good
    • 2

No1 さんの回答を具体化すれば・・・。



<A>
ID___F1_____F2
1____1111__1
2____1112__2
3____1113__3
4____1111__4

<クエリ2>
F1_______F2_New
1111____1,4
1112____2
1113____3

このクエリを SQLビューで見れば、割と簡単なものです。

SELECT A.F1, DBSELECT("SELECT F2 FROM A WHERE F1=" & F1, ",") AS F2_New
FROM A
GROUP BY A.F1;

まあ、課題は、DBSelect関数を用意できるか否かです。

<続く>
    • good
    • 0

VBA ( DAO 使用 ) で作ってみました。

( このプログラムのまま使用するのであれば参照設定で Microsoft DAO X.X Object Library を設定してください。)
Aテーブル→Table1
別テーブル→Table2
としました。
また、Table2 は空であることが前提です。
Private Sub コマンド0_Click()
Dim rsCode As Recordset
Dim strWhere As String
Dim rsNo As Recordset
Dim rsDst As Recordset
Dim strNos As String

Set rsCode = CurrentDb.OpenRecordset("SELECT DISTINCT Table1.コード FROM Table1", dbOpenForwardOnly)
Set rsDst = CurrentDb.OpenRecordset("SELECT * FROM Table2", dbOpenDynaset)
Do Until rsCode.EOF
strWhere = "WHERE Table1.コード=""" & rsCode.Fields("コード").Value & """"
Set rsNo = CurrentDb.OpenRecordset("SELECT Table1.No FROM Table1 " & strWhere, dbOpenForwardOnly)
strNos = ""
Do Until rsNo.EOF
If strNos <> "" Then
strNos = strNos & ","
End If
strNos = strNos & rsNo.Fields("No").Value
rsNo.MoveNext
Loop
Set rsNo = Nothing

With rsDst
.AddNew
.Fields("コード") = rsCode.Fields("コード").Value
.Fields("NO").Value = strNos
.Update
End With

rsCode.MoveNext
Loop
Set rsCode = Nothing
End Sub
    • good
    • 0

こんばんは!


ご質問を読んで、
横もちに替えるためにクロス集計して、
カンマで結合させるユーザー定義関数を作って文字連結させる方法
があるかなぁって思いました。

カンマつきではありませんが、
文字連結部分のSQLのご参考になれば。。。

SELECT T.コード, [1] & [2] & [3] & [4] AS 番号 FROM [ TRANSFORM Min(番号) SELECT コード FROM Aテーブル GROUP BY コード PIVOT 番号 In(1,2,3,4);]. as T
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A