多行合并为一行

时间:2022-01-07 10:28:13
在access中,有没有sql语句可以达到这样的效果:

原数据:
Field1      Field2
------------------------
1           张三
1           李四
1           赵五
2           钱六
3           孙八

合并后
Field1      Field2
------------------------
1           张三,李四,赵五
2           钱六
3           孙八

请各位高手指教?

15 个解决方案

#1


ding

#2


SQL不支持这种功能

不过可以用VBA写个函数来实现

#3


在Access中,只用SQL语句无法完成上述功能,必须借助VBA代码。

#4


--1、需要在“模块”中先创建一个用户自定义函数,如下:


'引用ADO
Public Function fn_GetData(strField1 As String) As String
    
    fn_GetData = ""
    
    Dim Rst As New ADODB.Recordset
    
    Rst.Open "select * from 表名 where Field1=" & strField1 & "", CurrentProject.Connection
    If Not Rst.EOF Then
        Do While Not Rst.EOF
            fn_GetData = fn_GetData & "," & Rst!Field2
            Rst.MoveNext
        Loop
        
        fn_GetData = Right(fn_GetData, Len(fn_GetData) - 1)
    End If
End Function


--2、在查询中,执行如下代码:

SELECT Field1,fn_GetData(Field1) as Field2
FROM 表名
GROUP BY Field1;

#5


上述方法是最简单的方法。

当然还有其他方法,如:循环所有的数据,按要求把数据追加到中间表中。

#6



Access使用的是Jet-SQL。


JET SQL 帮助(jet4 access2000)下载地址

http://www.access911.net/index.asp?board=8&recordid=75FAB71E&tt=

#7


--1、需要在“模块”中先创建一个用户自定义函数,如下:


'引用ADO
Public Function fn_GetData(strField1 As String) As String
    
    fn_GetData = ""
    
    Dim Rst As New ADODB.Recordset
    
    Rst.Open "select * from 表名 where Field1=" & strField1 & "", CurrentProject.Connection
    If Not Rst.EOF Then
        Do While Not Rst.EOF
            fn_GetData = fn_GetData & "," & Rst!Field2
            Rst.MoveNext
        Loop
        
        fn_GetData = Right(fn_GetData, Len(fn_GetData) - 1)
    End If
End Function


--2、在查询中,执行如下代码:

SELECT Field1,fn_GetData(Field1) as Field2
FROM 表名
GROUP BY Field1;

#8


在ACCESS中:
 select Field1 ,max(zj(Field1)) from tt group by Field1 
function zj(dd as integer)
ee=""
set ff=currentdb.openrecordset("select * from tt where Field1=" & dd)
do while not ff.eof
ee=ee & ff("field2") & ","
ff.movenext
loop
zj=left(ee,len(ee)-1)
end function

#9


只用SQL语句无法完成上述功能,必须借助VBA代码。 

#10


联合查询不可以吗?
(不好意思,我不确定了,不过以前用过一次联合查询,感觉效果和楼主需要的类似,今天机器刚重装,还安不了ACCESS测试,抱歉各位,只是提出来讨论,欢迎大家指正)

#11


联合查询无法实现楼主所提的需求。


在Access中,要实现这种字符串的聚合连接功能,必须写VBA代码。

#12


联合查询是记录级的,即横向的。

#13


提供另一种方案,用报表来实现,主子报表,子报表为多列报表(先行后列),这样就可以在一行显示组合数据

#14


好处是不用编程,不用写代码,相信在执行效率上也要快过循环数据的查询

#15


用报表有很多局限性,如:你预订设置多少列?

如果聚合的串有很多项,用报表处理显示不太合适。

#1


ding

#2


SQL不支持这种功能

不过可以用VBA写个函数来实现

#3


在Access中,只用SQL语句无法完成上述功能,必须借助VBA代码。

#4


--1、需要在“模块”中先创建一个用户自定义函数,如下:


'引用ADO
Public Function fn_GetData(strField1 As String) As String
    
    fn_GetData = ""
    
    Dim Rst As New ADODB.Recordset
    
    Rst.Open "select * from 表名 where Field1=" & strField1 & "", CurrentProject.Connection
    If Not Rst.EOF Then
        Do While Not Rst.EOF
            fn_GetData = fn_GetData & "," & Rst!Field2
            Rst.MoveNext
        Loop
        
        fn_GetData = Right(fn_GetData, Len(fn_GetData) - 1)
    End If
End Function


--2、在查询中,执行如下代码:

SELECT Field1,fn_GetData(Field1) as Field2
FROM 表名
GROUP BY Field1;

#5


上述方法是最简单的方法。

当然还有其他方法,如:循环所有的数据,按要求把数据追加到中间表中。

#6



Access使用的是Jet-SQL。


JET SQL 帮助(jet4 access2000)下载地址

http://www.access911.net/index.asp?board=8&recordid=75FAB71E&tt=

#7


--1、需要在“模块”中先创建一个用户自定义函数,如下:


'引用ADO
Public Function fn_GetData(strField1 As String) As String
    
    fn_GetData = ""
    
    Dim Rst As New ADODB.Recordset
    
    Rst.Open "select * from 表名 where Field1=" & strField1 & "", CurrentProject.Connection
    If Not Rst.EOF Then
        Do While Not Rst.EOF
            fn_GetData = fn_GetData & "," & Rst!Field2
            Rst.MoveNext
        Loop
        
        fn_GetData = Right(fn_GetData, Len(fn_GetData) - 1)
    End If
End Function


--2、在查询中,执行如下代码:

SELECT Field1,fn_GetData(Field1) as Field2
FROM 表名
GROUP BY Field1;

#8


在ACCESS中:
 select Field1 ,max(zj(Field1)) from tt group by Field1 
function zj(dd as integer)
ee=""
set ff=currentdb.openrecordset("select * from tt where Field1=" & dd)
do while not ff.eof
ee=ee & ff("field2") & ","
ff.movenext
loop
zj=left(ee,len(ee)-1)
end function

#9


只用SQL语句无法完成上述功能,必须借助VBA代码。 

#10


联合查询不可以吗?
(不好意思,我不确定了,不过以前用过一次联合查询,感觉效果和楼主需要的类似,今天机器刚重装,还安不了ACCESS测试,抱歉各位,只是提出来讨论,欢迎大家指正)

#11


联合查询无法实现楼主所提的需求。


在Access中,要实现这种字符串的聚合连接功能,必须写VBA代码。

#12


联合查询是记录级的,即横向的。

#13


提供另一种方案,用报表来实现,主子报表,子报表为多列报表(先行后列),这样就可以在一行显示组合数据

#14


好处是不用编程,不用写代码,相信在执行效率上也要快过循环数据的查询

#15


用报表有很多局限性,如:你预订设置多少列?

如果聚合的串有很多项,用报表处理显示不太合适。