Verketten mehrerer Zeilen in einer einzelnen Zeile in MS Access [duplizieren]

8

Zur Zeit habe ich eine Tabellenstruktur, die ungefähr so ​​lautet:

Name --- Katze --- Desc --- Thresh --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- PBC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- ZTM2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- FLC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 ----- KSC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- JYC2

Was ich suche, ist eine Zeile pro "Name" und pro "Katze", die alle "Err" (pro "Name" und "Katze") zusammenfasst und nur die "BP" verkettet Felder in einer einzigen Zeile. Wie:

Name --- Katze --- Desc --- Thresh --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2, VBE2, AEC2
Bob ------- C2 ------ Com ------ 8Per -------- 0,45 ------ 4 ------ XBC4, ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ------ QYC2 , KSC2

Es wurden ähnliche Fragen gestellt, aber ich kann es nicht anwenden, da meine Kenntnisse im VBA-Scripting Anfänger sind. Gibt es eine Möglichkeit, all dies über SQL zu tun? Wenn VBA-Scripting die einzige Option ist (dh das Erstellen einer Funktion), wird jede Hilfe sehr geschätzt. Vielen Dank im Voraus.

Frage Teil 2:
Ich habe die Funktion nach Allen Browne's Guide erstellt. Das Modul wird als modConcatRelated gespeichert. Jetzt habe ich versucht, diese Abfrage auszuführen (ich bin nicht sicher, ob dies die richtige SQL ist, um das Ergebnis zu erhalten, nach dem ich suche):

%Vor%

Er sagte "Fehler 3061. Zu wenige Parameter. Erwartet 1." Außerdem hieß es "Undefined Function ConcatRelated". Ich suche nach Anleitung zum Erstellen der richtigen SQL-Anweisung, damit ich die ConcatRelated-Funktion korrekt aufrufen und das Ergebnis wie oben dargestellt erhalten kann. Nochmals vielen Dank.

Nächste Frage:
Was wäre, wenn in der Tabelle ein eindeutiges Datumsfeld als letzte Spalte in der Tabelle markiert wäre? Etwas wie das:

Name --- Katze --- Desc --- Thresh --- Perc --- Err --- BP --- Datum

Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2--12 / 02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2-- 09/05/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2-- 11/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2-- 14/08/2012
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2-- 25/02/2009
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2-- 07/02/2011
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4-09 / 05/2011
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2-02 / 02/2010
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2--08 / 14/2012
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2--05 / 05/2001
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2--08 / 02/2010
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2--06 / 17/2010
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- PBC2 --08 / 14/2012
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- ZTM2 - 09/05/2011
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2 --05 / 17/2010
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- FLC2 --3 / 19/2010
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 ----- KSC2 - 09/05/2011
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- JYC2--08 / 14/2012

Nehmen wir an, ich wollte eine Abfrage erstellen, um etwas zu sagen: Zeige mir alle Datensätze, die immer noch im selben Format sind:

Name --- Katze --- Desc --- Thresh --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2, VBE2, AEC2
Bob ------- C2 ------ Com ------ 8Per -------- 0,45 ------ 4 ------ XBC4, ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ------ QYC2 , KSC2

Aber für einen Zeitraum vom 01/01/2009 bis 31/09/2011

@HansUp könntest du dabei helfen?

    
JT2013 09.02.2012, 19:14
quelle

1 Antwort

5

Ich habe eine Unterabfrage für GROUP BY verwendet, die die Summe von Err für jede Gruppe berechnet. Dann fügte ich die ConcatRelated-Funktion ( von Allen Browne ) mit den Feldern hinzu, die von der Unterabfrage zurückgegeben wurden. Dies ist die Abfrage und die Ausgabe (basierend auf Ihren Beispieldaten in make_table_bp) aus der Abfrage:

%Vor%

Die Abfrage gibt diese Ergebnismenge aus:

%Vor%

Beachten Sie, dass ich Name, Desc und Err mit eckigen Klammern an jeder Stelle eingeschlossen habe, auf die sie in der Abfrage verwiesen wurden. Alle sind reservierte Wörter (siehe Problemnamen und reservierte Wörter in Access ). Wählen Sie nach Möglichkeit andere Namen für diese Felder. Wenn nicht, verwenden Sie die eckigen Klammern, um eine Verwechslung der db-Engine zu vermeiden.

Dies funktioniert jedoch nur, wenn / bis Ihre Kopie der ConcatRelated-Funktion von Ihrer Datenbank erkannt wird. Ich verstehe nicht, warum es nicht ist; Ich habe dieselben Schritte ausgeführt, die Sie zum Speichern des Funktionscodes angegeben haben, und das funktioniert auf meinem System einwandfrei.

Bearbeiten : Ich habe diese Abfrage mit meiner Version der Tabelle getestet, die [Err] als numerischen Datentyp hat. Klingt wie dein Text ist stattdessen Text. In diesem Fall schlage ich vor, dass Sie auch Ihren Wert auf numerisch ändern. Ich sehe den Vorteil nicht numerische Werte als Text anstelle von tatsächlichen Zahlen zu speichern.

Wenn Sie jedoch [Err] als Text verwenden, können Sie die Abfrage anpassen, um damit umzugehen. Ändere das ...

%Vor%

dazu ...

%Vor%

Diese Änderung verhinderte den Fehler "Datentyp nicht übereinstimmend in Kriterienausdruck", wenn ich mit [Err] als Textdatentyp getestet habe. Das habe ich aber auch geändert ...

%Vor%

dazu ...

%Vor%

AFAICT diese zweite Änderung ist nicht unbedingt notwendig. Die db-Engine scheint bereit zu sein, Zahlen als Text zu akzeptieren, wenn Sie sie nach Sum () fragen. Allerdings bevorzuge ich es, sie explizit in numerische Werte zu transformieren, anstatt von der db-Engine abhängig zu sein, um die richtige Schätzung in meinem Namen zu treffen. Die db-Engine hat genug andere Dinge zu bewältigen, also versuche ich genau zu sagen, was ich will.

Edit2 : Wenn nur eindeutige Werte verkettet werden sollen, können Sie die Funktion ConcatRelated () ändern. Finde diesen Abschnitt des Codes ...

%Vor%

und ändere es zu diesem ...

%Vor%     
HansUp 10.02.2012, 17:37
quelle

Tags und Links