一列值,多行合并成一行

时间:2022-10-05 10:29:05
现在有一个表的数据如下
col1,col2,col3
A     B    C
A     D    K
A     D    B
C     A     1
C     A    2
希望得到
A     B    C
A     D    K,B
C     A    1,2
急求这样的查询怎么实现,大体知道得用vba,但是对recordset对象不太了解不能象ado.net中的datatable那样处理,求帮忙

6 个解决方案

#1


用VBA+SQL实现,且必须在ACCESS中,你的环境?语言+MDB?

#2


跟其他的没一点关系,就是个单独access 程序 我是说我熟悉ado.net但是对ado的record对象操作不熟悉,而且我知道这个得用vba写,就是这点写不出来,我的思路是在vba工程中创建一个函数然后这个函数返回一个recordset 然后我再把这个recordset当作一个查询的数据源供其他地方使用

#3


select col1,col2,max(lja(col1,col2)) from tt group by col1,col2
模块:
Function lja(ByVal z1 As String,z2 As String)
aa = ""
Set rs = CurrentDb.OpenRecordset("SELECT *  from tt where col1='" & z1 & "' and col2='" & z2 &"'")
Do While Not rs.EOF
aa = aa & rs(2)
rs.MoveNext
Loop
lja = aa
End Function

#4


只能在ACCESS中使用,语言中思路一致,在语言中指东画西记录集循环取值、累加

#5


感谢大神,我先调试修改下如果没问题就结贴

#6


引用
2. DCONCAT 域字符串合并函数


DCONCAT 函数

可以使用 DCONCAT 函数连接指定的一组记录(域)中的一组值的字符串。
可以在 Visual Basic、宏、查询表达式或者计算控件中使用 DCONCAT 函数。
(ADO/DAO不支持)。

例如,可以在查询中使用 DCONCAT 函数。
select customerID, DCONCAT('orderID','orders','customerID=' & customerID 
from customers

DCONCAT(expr, domain, [criteria],[delimiter])
DCONCAT 函数具有下列参数。

参数     说明 
expr      表达式,用于标识要计算其记录数的字段。它可以是标识表或查询中
          字段的字符串表达式,也可以是对该字段中的数据执行计算的表达式。
          在 expr 中,可以包含表中字段的名称、窗体上的控件、常量或函数。
          如果 expr 包含一个函数,那么它可能是内置或用户定义的函数,但
          不是另一个域聚合函数或 SQL 聚合函数。 
domain    字符串表达式,用于标识组成域的一组记录。它可以是表名称或不需
          要参数的查询的查询名称。 
criteria  可选字符串表达式,用于限制对其执行 DCONCAT 函数的目标数据的范
          围。例如,criteria 通常等价于 SQL 表达式中的 WHERE 子句,但它
          没有单词 WHERE。如果 criteria 被省略,那么 DCONCAT 函数将针对
          整个域计算 expr。任何包含在 criteria 中的字段必须也是 domain 
          中的字段;否则 DCONCAT 函数将返回 错误信息。 
delimiter 可选字符串表达式,用于分隔各记录的字符串值。默认值为逗号"," 。


函数实现



'*******************************************************************************
' DCONCAT(expr, domain, [criteria],[delimiter])
'
' Function:  to concate the columns string like group_concat() in Access.
' Parameter: 
'             expr      : string, expression which can recognized by SQL.
'             domain    : string, the row source, can be another query.
'             criteria  : the ceritera which will be treated as the where clause.
'             delimiter : delimiter between the column value, default is ",".

' Return:     string, a String of concated columns, 
'                     if err, return the err code + desc.
'
' history:
'   2009-Feb-28 ACMAIN New Creation
'
'*********************************************************************************

Public Function DCONCAT(sExpr As String, sDomain As String, Optional sCriteria As String, Optional sDelimiter As String = ",")
    On Error GoTo ErrHandler
    
    Dim rs As New ADODB.Recordset
    
    Dim sSQL As String
    Dim sResult As String
    sResult = ""
    
    sSQL = "select " & sExpr & " from (" & sDomain & ")"
    If sCriteria <> "" Then
        sSQL = sSQL & " where " & sCriteria
    End If
    
    rs.Open sSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
    
    Do While Not rs.EOF
        If sResult <> "" Then
            sResult = sResult & sDelimiter
        End If
        sResult = sResult & rs.Fields(0).Value
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    
    DCONCAT = sResult
    
    Exit Function
    
ErrHandler:
    If rs.State <> adStateClosed Then
        rs.Close
    End If
    Set rs = Nothing
    
    DCONCAT = Err.Number & " : " & Err.Description
    
    
End Function 

#1


用VBA+SQL实现,且必须在ACCESS中,你的环境?语言+MDB?

#2


跟其他的没一点关系,就是个单独access 程序 我是说我熟悉ado.net但是对ado的record对象操作不熟悉,而且我知道这个得用vba写,就是这点写不出来,我的思路是在vba工程中创建一个函数然后这个函数返回一个recordset 然后我再把这个recordset当作一个查询的数据源供其他地方使用

#3


select col1,col2,max(lja(col1,col2)) from tt group by col1,col2
模块:
Function lja(ByVal z1 As String,z2 As String)
aa = ""
Set rs = CurrentDb.OpenRecordset("SELECT *  from tt where col1='" & z1 & "' and col2='" & z2 &"'")
Do While Not rs.EOF
aa = aa & rs(2)
rs.MoveNext
Loop
lja = aa
End Function

#4


只能在ACCESS中使用,语言中思路一致,在语言中指东画西记录集循环取值、累加

#5


感谢大神,我先调试修改下如果没问题就结贴

#6


引用
2. DCONCAT 域字符串合并函数


DCONCAT 函数

可以使用 DCONCAT 函数连接指定的一组记录(域)中的一组值的字符串。
可以在 Visual Basic、宏、查询表达式或者计算控件中使用 DCONCAT 函数。
(ADO/DAO不支持)。

例如,可以在查询中使用 DCONCAT 函数。
select customerID, DCONCAT('orderID','orders','customerID=' & customerID 
from customers

DCONCAT(expr, domain, [criteria],[delimiter])
DCONCAT 函数具有下列参数。

参数     说明 
expr      表达式,用于标识要计算其记录数的字段。它可以是标识表或查询中
          字段的字符串表达式,也可以是对该字段中的数据执行计算的表达式。
          在 expr 中,可以包含表中字段的名称、窗体上的控件、常量或函数。
          如果 expr 包含一个函数,那么它可能是内置或用户定义的函数,但
          不是另一个域聚合函数或 SQL 聚合函数。 
domain    字符串表达式,用于标识组成域的一组记录。它可以是表名称或不需
          要参数的查询的查询名称。 
criteria  可选字符串表达式,用于限制对其执行 DCONCAT 函数的目标数据的范
          围。例如,criteria 通常等价于 SQL 表达式中的 WHERE 子句,但它
          没有单词 WHERE。如果 criteria 被省略,那么 DCONCAT 函数将针对
          整个域计算 expr。任何包含在 criteria 中的字段必须也是 domain 
          中的字段;否则 DCONCAT 函数将返回 错误信息。 
delimiter 可选字符串表达式,用于分隔各记录的字符串值。默认值为逗号"," 。


函数实现



'*******************************************************************************
' DCONCAT(expr, domain, [criteria],[delimiter])
'
' Function:  to concate the columns string like group_concat() in Access.
' Parameter: 
'             expr      : string, expression which can recognized by SQL.
'             domain    : string, the row source, can be another query.
'             criteria  : the ceritera which will be treated as the where clause.
'             delimiter : delimiter between the column value, default is ",".

' Return:     string, a String of concated columns, 
'                     if err, return the err code + desc.
'
' history:
'   2009-Feb-28 ACMAIN New Creation
'
'*********************************************************************************

Public Function DCONCAT(sExpr As String, sDomain As String, Optional sCriteria As String, Optional sDelimiter As String = ",")
    On Error GoTo ErrHandler
    
    Dim rs As New ADODB.Recordset
    
    Dim sSQL As String
    Dim sResult As String
    sResult = ""
    
    sSQL = "select " & sExpr & " from (" & sDomain & ")"
    If sCriteria <> "" Then
        sSQL = sSQL & " where " & sCriteria
    End If
    
    rs.Open sSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
    
    Do While Not rs.EOF
        If sResult <> "" Then
            sResult = sResult & sDelimiter
        End If
        sResult = sResult & rs.Fields(0).Value
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    
    DCONCAT = sResult
    
    Exit Function
    
ErrHandler:
    If rs.State <> adStateClosed Then
        rs.Close
    End If
    Set rs = Nothing
    
    DCONCAT = Err.Number & " : " & Err.Description
    
    
End Function