Combinar filas / concatenar filas
-
01-07-2019 - |
Pregunta
Estoy en busca de un Acceso de 2007, equivalente a SQL Server se UNEN función.
En SQL Server se podría hacer algo como:
Persona
John
Steve
Richard
SQL
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
Que produce:Juan, Steve, Richard
Yo quiero hacer lo mismo pero en Access 2007.
¿Alguien sabe cómo combinar filas como esta en Access 2007?
Solución
Aquí está un ejemplo 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;
Un ADO versión, inspirada en un comentario por 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
Otros consejos
Creo que Nz es lo que está después, la sintaxis es Nz(variant, [if null value])
.Aquí está el enlace para la 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 un comparables cosa a la que se UNEN, no se puede utilizar en el Acceso a hacer la operación que se realiza.No los UNEN que es la construcción de la lista de valores de fila, es el concatenatiion en una variable.
Por desgracia, esto no es posible dentro de una consulta de Access que tiene que ser una única sentencia SQL y donde no hay instalaciones para declarar una variable.
Creo que sería necesario crear una función que abre un conjunto de resultados, iterar sobre ella y concatenar los valores de la fila en una cadena.
Para combinar filas en el Acceso, probablemente necesitarás el código que se ve algo como 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
Usted querrá agregar código de tratamiento de errores y limpiar su conjunto, y esto va a cambiar un poco si se 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 usted describe en el Acceso.
En "estándar" de Acceso (conjunto de registros), usted tendrá que abrir un conjunto de registros y utilizar el método getrows de 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 usted tiene esta matriz (será bidimensional), se puede manipular para extraer la "columna" que usted necesita.Podría ser una manera inteligente para extraer una matriz de dimensión de esto, así que usted puede utilizar el "Join" instrucción para concatenar cada valor de matriz en una cadena.