Ms Access Query: concatenazione di righe attraverso una query

Supponiamo che abbia una tabella in Ms Access con le seguenti informazioni:

ColumnA ColumnB 1 abc 1 pqr 1 xyz 2 efg 2 hij 3 asd 

La mia domanda è, come posso concatenare i valori nella seconda colonna a un valore di riga basato sulla prima colonna. I risultati della query che desidero sono i seguenti:

 ColumnA ColumnB 1 abc, pqr, xyz 2 efg, hij 3 asd 

Voglio raggiungere questo attraverso una query. Qualcuno può aiutarmi a raggiungere questo?

Hai bisogno di una funzione per fare la concatenazione.

Microsoft Access condensa più righe in una tabella

Esempio usando i tuoi dati:

 Select T.ColumnA , GetList("Select ColumnB From Table1 As T1 Where T1.ColumnA = " & [T].[ColumnA],"",", ") AS ColumnBItems From Table1 AS T Group By T.ColumnA; 

Ecco un link in sospeso: come farlo all’interno di SQL chiamando una funzione. Le istruzioni sono eccezionalmente chiare e la funzione è scritta per te in modo che tu possa semplicemente copiare, incollare e andare. Anche qualcuno senza conoscenza di VB può facilmente implementarlo: concatena i valori dei record correlati

questo può essere molto difficile da ottenere. Se DEVI farlo in una query e non in una funzione, il problema in cui ti imbatterai è il limite del numero di righe che puoi concatenare in una colonna. Finora l’unico modo che ho trovato per raggiungere questo objective è tramite dichiarazioni iif.

 SELECT test1.ColumnA AS ColumnA, First([test1].[ColumnB]) & IIf(Count([test1].[ColumnB])>1,"," & Last([test1].[ColumnB])) AS ColumnB FROM test1 GROUP BY test1.ColumnA; 

ritorna:

 ColumnA ColumnB 1 abc,xyz 2 efg,hij 3 asd 

Questo restituirà solo il primo e l’ultimo, ma sono sicuro che con un po ‘di lavoro potresti risolvere la funzione Choose, ma come ho detto dovresti aggiungere più istruzioni if ​​per ciascun elemento aggiuntivo che vuoi aggiungere, da cui il limitazione.

La tabella potrebbe avere una colonna di sequenza, che gli fornisce una chiave primaria univoca della sequenza ColumnA:

 table: t1 ColumnA sequence ColumnB 1 1 abc 1 2 pqr 1 3 xyz 2 1 efg 2 2 hij 3 1 asd 

E potrebbe essere creata una Crosstab:

 query: x1 TRANSFORM Min([columnB] & ", ") AS Expr1 SELECT t1.columnA FROM t1 GROUP BY t1.columnA PIVOT t1.sequence; columnA 1 2 3 1 abc, pqr, xyz, 2 efg, hij, 3 asd, 

Quindi una query finale può combinare le colonne e rimuovere l’ultima virgola:

 SELECT x1.columnA, Left([1] & [2] & [3],Len([1] & [2] & [3])-2) AS columnB FROM x1; columnA columnB 1 abc, pqr, xyz 2 efg, hij 3 asd 

Per automatizzare il riempimento della sequenza, è ansible utilizzare il seguente codice VBA:

 Sub fill_sequence_t1() Dim i: i = 1 Do While DCount("*", "t1", "sequence IS NULL") > 0 DoCmd.RunSQL "SELECT t1.columnA, Min(t1.columnB) AS columnB_min INTO t2" & _ " FROM t1 WHERE t1.sequence IS NULL GROUP BY t1.columnA;" DoCmd.RunSQL "UPDATE t1 INNER JOIN t2 ON (t1.columnA = t2.columnA)" & _ " AND (t1.columnB = t2.columnB_min) SET t1.sequence=" & i CurrentDb.TableDefs.Delete "t2" i = i + 1 Loop End Sub