wake-up-neo.com

Ms Access Query: Verketten von Zeilen durch eine Abfrage

Angenommen, ich habe eine Tabelle in MS Access mit folgenden Informationen:

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

Meine Frage ist, wie kann ich die Werte in der zweiten Spalte mit einem Zeilenwert verketten, der auf der ersten Spalte basiert. Die Abfrageergebnisse, die ich möchte, lauten wie folgt:

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

Ich möchte dies durch eine Abfrage erreichen. Kann mir jemand helfen, dies zu erreichen?

21
reggie

Sie benötigen eine Funktion, um die Verkettung durchzuführen.

Microsoft Access verdichtet mehrere Zeilen in einer Tabelle

Beispiel mit Ihren Daten:

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;
20
Thomas

Hier ist ein hervorragender Link zu Re: wie Sie dies aus SQL heraus tun, indem Sie eine Funktion aufrufen. Die Anweisungen sind außergewöhnlich klar und die Funktion wurde für Sie geschrieben, sodass Sie einfach kopieren, einfügen und loslegen können. Selbst jemand, der keine Kenntnis von VB hat, kann dies leicht implementieren: Verketten Sie Werte aus verknüpften Datensätzen

5
Deborah Cole

dies kann sehr schwer zu bekommen sein. Wenn Sie in einer Abfrage MÜSSEN, nicht in einer Funktion, MÜSSEN Sie das Problem auf die Anzahl der Zeilen, die Sie in einer Spalte verketten können, besteht. Bisher habe ich dies nur über Iif-Anweisungen gefunden.

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

kehrt zurück:

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

Dies wird nur das erste und das letzte zurückgeben, aber ich bin mir sicher, mit ein wenig Arbeit könnten Sie die Choose-Funktion ausarbeiten, aber wie ich bereits sagte, müssten Sie für jedes weitere Element, das Sie hinzufügen möchten, mehr iif-Anweisungen hinzufügen, daher die Verjährung.

2
Patrick

Die Tabelle könnte eine Sequenzspalte haben, die einen eindeutigen Primärschlüssel der ColumnA-Sequenz ergibt:

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

Und eine Kreuztabelle könnte erstellt werden:

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,

Dann kann eine letzte Abfrage die Spalten kombinieren und das letzte Komma entfernen:

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

Um das Ausfüllen der Sequenz zu automatisieren, kann der folgende VBA-Code verwendet werden:

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
1
Will