ms-access - una - unir celdas en excel
Combinar filas/concatenar filas (5)
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?
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 declaración 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.
Creo que Nz es lo que buscas, la sintaxis 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
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 este conjunto (será bidimensional), puede manipularlo 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.
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.
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