Combiner des lignes / concaténer des lignes
-
01-07-2019 - |
Question
Je recherche un accès 2007 équivalent à la fonction COALESCE de SQL Server.
Dans SQL Server, vous pouvez faire quelque chose comme:
Personne
John
Steve
Richard
SQL
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
Qui produit: John, Steve, Richard
Je souhaite faire de même, mais dans Access 2007.
Quelqu'un sait-il comment combiner de telles lignes dans Access 2007?
La solution
Voici un exemple de fonction définie par l'utilisateur (UDF) et d'utilisation possible.
Fonction:
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
Utilisation:
SELECT documents.MembersOnly,
Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who,
Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;
Une version ADO, inspirée par un commentaire 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
Autres conseils
Je pense que Nz est ce que vous recherchez, la syntaxe est Nz (variant, [si valeur nulle])
. Voici le lien vers la documentation: Fonction Nz
---Person---
John
Steve
Richard
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
Bien que Nz fasse une chose comparable à COALESCE, vous ne pouvez pas l'utiliser dans Access pour effectuer l'opération que vous effectuez. Ce n'est pas la COALESCE qui construit la liste des valeurs de ligne, mais la concaténation en une variable.
Malheureusement, cela n’est pas possible dans une requête Access qui doit être une seule instruction SQL et où il n’existe aucune possibilité de déclarer une variable.
Je pense que vous auriez besoin de créer une fonction permettant d'ouvrir un jeu de résultats, de l'itérer dessus et de concaténer les valeurs de ligne dans une chaîne.
Pour combiner des lignes dans Access, vous aurez probablement besoin d'un code ressemblant à ceci:
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
Vous voudrez ajouter un code de traitement des erreurs et nettoyer votre jeu d'enregistrements. Cela changera légèrement si vous utilisez ADO au lieu de DAO, mais l'idée générale est la même.
Je comprends ici que vous avez une table "personne". avec 3 enregistrements. Il n'y a rien de comparable à ce que vous décrivez dans Access.
In " standard " Access (jeu d'enregistrements DAO), vous devrez ouvrir un jeu d'enregistrements et utiliser la méthode getrows pour que vos données soient
Dim rs as DAO.recordset, _
personList as String, _
personArray() as variant
set rs = currentDb.open("Person")
set personArray = rs.getRows(rs.recordcount)
rs.close
une fois que vous avez ce tableau (ce sera bidimensionnel), vous pouvez le manipuler pour extraire la " colonne " tu auras besoin. Il existe peut-être un moyen astucieux d’en extraire un tableau à une dimension. Vous pouvez alors utiliser la commande " Joindre " instruction pour concaténer chaque valeur de tableau dans une chaîne.