关于vba:合并行/串联行

关于vba:合并行/串联行

Combine rows / concatenate rows

我正在寻找与SQL Server的COALESCE函数等效的Access 2007。

在SQL Server中,您可以执行以下操作:

1
2
3
John
Steve
Richard

的SQL

1
2
3
4
5
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable

PRINT @PersonList

产生:约翰,史蒂夫,理查德

我想在Access 2007中做同样的事情。

有谁知道如何在Access 2007中合并这样的行?


这是示例用户定义功能(UDF)及其可能的用法。

功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Function Coalsce(strSQL As String, strDelim, ParamArray NameList() As Variant)
Dim db As Database
Dim rs As DAO.Recordset
Dim strList As String

    Set db = CurrentDb

    If strSQL <>"" Then
        Set rs = db.OpenRecordset(strSQL)

        Do While Not rs.EOF
            strList = strList & strDelim & rs.Fields(0)
            rs.MoveNext
        Loop

        strList = Mid(strList, Len(strDelim))
    Else

        strList = Join(NameList, strDelim)
    End If

    Coalsce = strList

End Function

用法:

1
2
3
4
SELECT documents.MembersOnly,
    Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who,
    Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;

ADO版本,灵感来自onedaywhen的评论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function ConcatADO(strSQL As String, strColDelim, strRowDelim, ParamArray NameList() As Variant)
   Dim rs As New ADODB.Recordset
   Dim strList As String

   On Error GoTo Proc_Err

       If strSQL <>"" Then
           rs.Open strSQL, CurrentProject.Connection
           strList = rs.GetString(, , strColDelim, strRowDelim)
           strList = Mid(strList, 1, Len(strList) - Len(strRowDelim))
       Else
           strList = Join(NameList, strColDelim)
       End If

       ConcatADO = strList

   Exit Function

   Proc_Err:
       ConcatADO ="***" & UCase(Err.Description)
   End Function

来自:http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29


我在这里了解到您有一个表" person",其中包含3条记录。没有什么可与您在Access中描述的内容相提并论。

在"标准"访问(DAO记录集)中,您将必须打开一个记录集并使用getrows方法获取数据

1
2
3
4
5
6
7
8
Dim rs as DAO.recordset, _
    personList as String, _
    personArray() as variant

set rs = currentDb.open("Person")
set personArray = rs.getRows(rs.recordcount)

rs.close

一旦有了这个数组(它将是二维的),就可以对其进行操作以提取所需的"列"。可能有一种聪明的方法可以从中提取一维数组,因此您可以使用" Join"指令将每个数组值连接到一个字符串中。


要在Access中合并行,您可能需要看起来像这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function Coalesce(pstrTableName As String, pstrFieldName As String)

Dim rst As DAO.Recordset
Dim str As String

    Set rst = CurrentDb.OpenRecordset(pstrTableName)
    Do While rst.EOF = False
        If Len(str) = 0 Then
            str = rst(pstrFieldName)
        Else
            str = str &"," & rst(pstrFieldName)
        End If
        rst.MoveNext
    Loop

    Coalesce = str

End Function

您将需要添加错误处理代码并清理您的记录集,如果您使用ADO而不是DAO,这会稍有改变,但是总体思路是相同的。


尽管Nz可以与COALESCE相比,但是您不能在Access中使用它来执行您要执行的操作。构建行值列表的不是COALESCE,而是连接到变量中。

不幸的是,在必须具有单个SQL语句且没有声明变量的工具的Access查询中,这是不可能的。

我认为您需要创建一个函数,该函数将打开结果集,对其进行迭代,然后将行值连接为字符串。


我认为Nz是您的追求,语法是Nz(variant, [if null value])。这是文档链接:Nz函数

1
2
3
4
5
6
7
8
9
10
---Person---
John
Steve
Richard

DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable

PRINT @PersonList


推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    针灸科设置|针灸科常见操作

    针灸科设置|针灸科常见操作,,1. 针灸科常见操作⒈临床实践技能(临床实际本领)考核 ⑴基本操作:①中医四诊、针灸、推拿、拔罐等中医临床技术;

    如何解决errtor加载操作系统的引导

    如何解决errtor加载操作系统的引导,,电脑启动后,屏幕上出现了errtor加载操作system错误提示,无法继续启动进入系统。以下是diskedit软件解决

    萤石设置方法|萤石操作手册下载

    萤石设置方法|萤石操作手册下载,,1. 萤石操作手册下载寻找验证码方法:恢复萤石云的验证码,需要在浏览器输入摄像头的ip地址登陆到一下界面:此