ACCESS 一对多合并为一行数据

2022-2-3 11:34:29 [大杂烩 - PC与手机]

对于一个人有多辆车、一个学生多门成绩这种情况,有时是两张表,一个是学生信息表,一个是车牌或成绩表,这个表里面同一姓名会有多条记录。如果需要做成一张一览表,怎么写查询呢?


在ACCESS 里创建 宏 模块
粘入以下代码:

Public Function GroupConcat(TableName As String, FieldName As String, GroupField As String, GroupValue As String) As String

  Dim ResultStr As String
  Dim sql As String
  
  Dim rs As ADODB.Recordset

  sql = "select " & FieldName & " from " & TableName & " where " & GroupField & "='" & GroupValue & "'"
    
  Set rs = New ADODB.Recordset
  rs.Open sql, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
    
  Do While Not rs.EOF
    ResultStr = ResultStr & "," & rs.Fields(0).Value
    rs.MoveNext
  Loop

  If ResultStr <> "" Then ResultStr = Mid(ResultStr, 2)
  GroupConcat = ResultStr
End Function

创建查询时引用此函数:

GroupConcat('表名','合并字段','分组字段',分组字段值)

如两个表,用户表(姓名,手机),车牌表(姓名,车牌号)

select 姓名,手机,GroupConcat('车牌表','车牌号','姓名',姓名) from 用户表

显示结果:

张三 13018004321 车牌1,车牌2

李四 13986866565 车牌1


以上仅在ACCESS 程序中使用,使用ADO等在SQL语句中不能使用。


如果是SQL SERVER 数据库,可以SQL语句中使用以下:

select 分组字段,(SELECT [合并字段]
          FROM 表名 t
          WHERE t.分组字段 = 表名.分组字段
          FOR xml path(''))
from 表名 group by 分组字段