原数据:
Field1 Field2
------------------------
1 张三
1 李四
1 赵五
2 钱六
3 孙八
合并后
Field1 Field2
------------------------
1 张三,李四,赵五
2 钱六
3 孙八
请各位高手指教?
15 个解决方案
#1
ding
#2
SQL不支持这种功能
不过可以用VBA写个函数来实现
不过可以用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;
'引用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
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测试,抱歉各位,只是提出来讨论,欢迎大家指正)
(不好意思,我不确定了,不过以前用过一次联合查询,感觉效果和楼主需要的类似,今天机器刚重装,还安不了ACCESS测试,抱歉各位,只是提出来讨论,欢迎大家指正)
#11
联合查询无法实现楼主所提的需求。
在Access中,要实现这种字符串的聚合连接功能,必须写VBA代码。
在Access中,要实现这种字符串的聚合连接功能,必须写VBA代码。
#12
联合查询是记录级的,即横向的。
#13
提供另一种方案,用报表来实现,主子报表,子报表为多列报表(先行后列),这样就可以在一行显示组合数据
#14
好处是不用编程,不用写代码,相信在执行效率上也要快过循环数据的查询
#15
用报表有很多局限性,如:你预订设置多少列?
如果聚合的串有很多项,用报表处理显示不太合适。
如果聚合的串有很多项,用报表处理显示不太合适。
#1
ding
#2
SQL不支持这种功能
不过可以用VBA写个函数来实现
不过可以用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;
'引用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
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测试,抱歉各位,只是提出来讨论,欢迎大家指正)
(不好意思,我不确定了,不过以前用过一次联合查询,感觉效果和楼主需要的类似,今天机器刚重装,还安不了ACCESS测试,抱歉各位,只是提出来讨论,欢迎大家指正)
#11
联合查询无法实现楼主所提的需求。
在Access中,要实现这种字符串的聚合连接功能,必须写VBA代码。
在Access中,要实现这种字符串的聚合连接功能,必须写VBA代码。
#12
联合查询是记录级的,即横向的。
#13
提供另一种方案,用报表来实现,主子报表,子报表为多列报表(先行后列),这样就可以在一行显示组合数据
#14
好处是不用编程,不用写代码,相信在执行效率上也要快过循环数据的查询
#15
用报表有很多局限性,如:你预订设置多少列?
如果聚合的串有很多项,用报表处理显示不太合适。
如果聚合的串有很多项,用报表处理显示不太合适。