Combinar filas / concatenar filas

Estoy buscando un Access 2007 equivalente a la función COALESCE de SQL Server.

En SQL Server, podrías hacer algo como:

Persona

John Steve Richard 

SQL

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

Que produce: John, Steve, Richard

Quiero hacer lo mismo, pero en Access 2007.

¿Alguien sabe cómo combinar filas como esta en Access 2007?

Aquí hay una muestra de Función definida por el usuario (UDF) y posible uso.

Función:

 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 

Uso:

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

Una versión de ADO, inspirada en un comentario de onedaywhen

 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 

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

Creo que Nz es lo que buscas, la syntax es Nz(variant, [if null value]) . Aquí está el enlace de documentación: Función Nz

 ---Person--- John Steve Richard DECLARE @PersonList nvarchar(1024) SELECT @PersonList = Nz(@PersonList + ',','') + Person FROM PersonTable PRINT @PersonList 

Aunque Nz hace algo similar a COALESCE, no puede usarlo en Access para realizar la operación que está realizando. No es COALESCE quien está construyendo la lista de valores de fila, es la concatenación en una variable.

Desafortunadamente, esto no es posible dentro de una consulta de Access que tiene que ser una sola statement de SQL y donde no hay ninguna posibilidad de declarar una variable.

Creo que necesitaría crear una función que abriera un conjunto de resultados, iterar sobre él y concatenar los valores de fila en una cadena.

Para combinar filas en Access, probablemente necesites un código que se parece a esto:

 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 

Deberá agregar el código de manejo de errores y limpiar su conjunto de registros, y esto cambiará ligeramente si utiliza ADO en lugar de DAO, pero la idea general es la misma.

Entiendo aquí que tiene una tabla “persona” con 3 registros. No hay nada comparable a lo que describes en Access.

En el acceso “estándar” (conjunto de registros DAO), tendrá que abrir un juego de registros y usar el método getrows para tener sus datos

 Dim rs as DAO.recordset, _ personList as String, _ personArray() as variant set rs = currentDb.open("Person") set personArray = rs.getRows(rs.recordcount) rs.close 

una vez que tenga esta matriz (será bidimensional), puede manipularla para extraer la “columna” que necesitará. Puede haber una forma inteligente de extraer una matriz unidimensional de esta, para que luego pueda usar la instrucción “Unir” para concatenar cada valor de matriz en una cadena.