Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

nicht gewollte Doppelte Werte in Abfrage

Begonnen von mad, März 04, 2019, 23:17:29

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

jetzt hätte ich mein Problem mit der Abfrage von Jahr zu Jahr gelöst, aber nun ein weiteres. Und zwar habe ich jetzt doppelte Datensätze in meiner Abfrage.

Meine Abfrage setzt sich aus zwei Kreuz-Abfragen zusammen. In jeder für sich funktioniert die Von Jahr bis Jahr Abfrage problemlos, nur bei der Zusammengeführten leider nicht mehr. "DISTINCT" wende ich an, funktioniert trotzdem nicht. Was ist falsch?

Hier nun die drei Original SQL-Codes, zuerst die beiden Kreuz-Abfrage und als drittes die zusammenführung der beiden Kreuz-Abfragen. Zusätzlich noch drei Bilder dazu mit dem Abfragezeitraum 2016-2018:

PARAMETERS [Forms]![PA_Personal]![PAJahr1] Text ( 255 ), [Forms]![PA_Personal]![PAJahr2] Text ( 255 );
TRANSFORM Last(Übungen.ADatumU) AS LetzterWertvonDatum
SELECT Personal.Name
FROM Übungen INNER JOIN ([Registrierung-Üb] INNER JOIN Personal ON [Registrierung-Üb].Name = Personal.Namekenn) ON Übungen.UebKenn = [Registrierung-Üb].Übungen
WHERE ((([Registrierung-Üb].ÜbAtemschutz)=Yes) AND ((Übungen.Thema) Like "7.? *") AND ((Personal.Atemschutztraeger)=Yes) AND ((Personal.status) Like "Aktiv*") AND ((Year([Übungen.ADatumU])) Between [Forms]![PA_Personal]![PAJahr1] And [Forms]![PA_Personal]![PAJahr2]))
GROUP BY Personal.Name, Personal.Atemschutztraeger, Year([Übungen.ADatumU])
ORDER BY Personal.Name, Year([Übungen.ADatumU])
PIVOT Übungen.Thema In ("7.1 FwDV7 - Standortübung Atemschutz","7.2 FwDV7 - Übung ASZ-Lenting","7.3 FwDV7 - theoretische Einweisung Atemschutz");


PARAMETERS [Forms]![PA_Personal]![PAJahr1] Text ( 255 ), [Forms]![PA_Personal]![PAJahr2] Text ( 255 );
TRANSFORM Last(Einsaetze.ADatumE) AS LetzterWertvonDatum
SELECT Personal.Name
FROM Einsaetze INNER JOIN (Personal INNER JOIN [Registrierung-Einsatz] ON Personal.Namekenn = [Registrierung-Einsatz].Name) ON Einsaetze.EinsatzKenn = [Registrierung-Einsatz].Einsaetze
WHERE ((([Registrierung-Einsatz].Atemschutz)=Yes) AND ((Einsaetze.EinsatzArten) Like "Brand") AND ((Personal.Atemschutztraeger)=Yes) AND ((Personal.status) Like "Aktiv*") AND ((Year([Einsaetze.ADatumE])) Between [Forms]![PA_Personal]![PAJahr1] And [Forms]![PA_Personal]![PAJahr2]))
GROUP BY Personal.Name, Personal.Atemschutztraeger, Year([Einsaetze.ADatumE])
ORDER BY Personal.Name
PIVOT Einsaetze.EinsatzArten In ("Brand");


SELECT DISTINCT qyrPA_Personal_Kreuz.Name, qyrPA_Personal_Kreuz.[7_1 FwDV7 - Standortübung Atemschutz], qyrPA_Personal_Kreuz.[7_2 FwDV7 - Übung ASZ-Lenting], qyrPA_Personal_Kreuz.[7_3 FwDV7 - theoretische Einweisung Atemschutz], qyrPA_Ein_Personal_Kreuz.Brand
FROM qyrPA_Personal_Kreuz LEFT JOIN qyrPA_Ein_Personal_Kreuz ON qyrPA_Personal_Kreuz.Name = qyrPA_Ein_Personal_Kreuz.Name;

ebs17

In beiden Kreuztabellenabfragen gruppierst Du über mehr als nur Name. Daher kann das Feld Name alleine nicht als eindeutiger Schlüssel für eine Weiterverknüpfung ausreichen. Eine Vervielfältigung durch den JOIN ist dann zwangsläufig.
Mit freundlichem Glück Auf!

Eberhard

mad

Hallo ebs17,

leider sind meine Access-Kenntnisse vermutlich zu gering.
Ich habe mal die eine oder andere Gruppierung rausgenommen. Aber dann kommen immer wieder Fehlermeldungen wie:
bild1
bild2
Wenn ich die Gruppierung bei "Jahr([Übungen.ADatumU])" rausnehme kommt das falscher Ergebnis.

Bräuchte vermutlich eine detaillierte Beschreibung.

Danke
mad

ebs17

Zitateine detaillierte Beschreibung
Spaßvogel. Wo soll die herkommen, wenn man Sinn, Strukturen und ggf. Daten der Anwendung nicht kennt.

Auf einige hingeworfene Brocken kannst Du auch nur eben solche erwarten und darfst die selber ins Gesamtbild einfügen.

Aber: Wenn Deine KTA richtige Resultate bringen, kannst Du sie nicht einfach willkürlich wieder zusammenstreichen. Was soll da herauskommen?
Deine erste KTA zeigt drei Datensätze zu einem Name, das wären so gesehen auch Duplikate. Sieht man aber Name und Jahr in Kombination, könnte das Sinn machen. Also verwende das Jahr da ebenfalls im SELECT-Teil. Somit könntest Du beide KTA-Abfragen über diese Kombination verknüpfen.

Über die Rolle von Atemschutztraeger braucht man mangels Info nicht nachdenken.
Mit freundlichem Glück Auf!

Eberhard

mad

Hallo ebs17,

weis leider nicht wie ich das mit dem SELECT genau anwenden muß. Das mit dem Atemschutztraeger (Feuerwehr) ist eine wichtige Bedingung, den es sollen nur Aktive gelistet werden die auch Atemschutztraeger sind.
Habe mal eine Beispiel-DB hochgeladen. Zum Test die Abfrage "qyrPA_Üb_Ein" starten. Dann können Jahreszahlen zwischen 2016 und 2019 eingegeben werden, mehr Daten sind nicht enthalten. Pro Jahr müsste (wenn es den funktionieren würde) je eine Zeile pro Jahr und Namen angezeigt werden. Funktioniert derzeit aber nur wenn man sich auf ein Jahr (zB 2017) bzw. auf 2016-2017 beschränkt. Wenn ich 2017-2018 oder 2016-2018 eingebe, kommen doppelte Werte, manche Namen werden dann vier bzw. sechsmal angezeigt. Zur Info, es müssen nicht zwangsläufig alle Felder gefüllt sein.

Vielleicht könntest Du Dir das trotzdem ansehen, auch wenn ich es in Worten nicht so erklären kann, wäre Super nett.

Gruss
mad

MzKlMu

Hallo,
das ganze Datenmodell ist ziemlich verkorkst. Das beginnt schon damit, dass keine Beziehungen angelegt sind.
Für die Primärschlüssel und Fremdschlüssel die falschen Felder usw. usw.

Hier sollte einfach noch mal von vorn angefangen werden, das wird so nix.

Beschreibe mal die Aufgabe der DB.
Gruß Klaus

DF6GL

Hallo,


wenn Du an einem gutgemeinten(!) Rat interessiert bist, dann wirf diese "DB" in die Tonne...

Mach Dir anschließend (und ohne Access) Gedanken darüber, welche Daten zur Verfügung stehen und was Du von den existierenden Daten als Ergebnisse erwartest. (Datenanalyse). Da ist eigenlicht derlangwierigste und anspruchsvollste Vorgang beim entwickeln einer DB.

Fasse alle zusammengehörenden Daten zu einer Tabelle zusammen. Z. B. alle personenbezogenen Daten in Tabelle tblPersonen. Entspr. gilt  bei allen anderen Daten.  Fällt Dir auf, das irgendwelche Daten fehlen, dann füge die entspr. Felder in die jeweiligen Tabellen ein.  (Normalisierung)

Jede Tabelle erhält einen eindeutig (über ALLE Tabellen gesehen) benamsten Primärschlüssel (Autowert).  Alle anderen Felder sollten ebenfalls eindeutige Namensgebung erfahren. Vermeide Redundanzen, d. h. Felder mit einem bestimmten inhaltlichen Sinn gibt es in der DB nur einmal, ausgenommen sind die Fremdschlüssel (Datentyp Long).  Diese Fremdschlüssel erlauben das Erstellen von Beziehungen mit ref. Integrität, die essentiell für eine vernünftig funktionierende DB sind.  Die Beziehungen definierst Du zwingend im Access-Beziehungsfenster. (Folge der Normalisierung)

Verzichte weiterhin auf Leer- und Sonderzeichen, wie auch auf reservierte Wörter in den Feld- oder Tabellenamen ("Name" z. B. )

Wenn diese Tabellenkonstruktion aufgestellt ist, dann wäre der nächste Schritt, diese Tabellenkonstruktion ein weiteres Mal zu überdenken und evtl. Unklarheiten zu eliminieren, bzw. fehlende Felder zu ergänzen.

Erst dann kommt der weitere Schritt,  der im vorangegangen Satz beschrieben ist.

Soll heißen, man kann nicht oft genug die Tabellenkonstruktion auf ihre logischen Zusammenhänge überdenken.

Ist man bei einem Punkt angelangt, an dem man von der Richtigkeit des Tabellenaufbaus fest überzeugt ist, dann ist für jede Tabelle ein Formular zu erstellen. 

1:n -Beziehungen bei Arbeitstabellen bildet man am Besten mit einer Haupt-Unterform-Konstruktion ab. Werte aus Stamm-/Nachschlagetabellen können mit Hilfe von Kombifeldern ausgewählt werden.  Auf "exotisches Layout" und Spielereien kann an dieser Stelle getrost noch verzichtet werden.


Zu diesem Zeitpunkt wird man feststellen, dass es immer noch Unklarheiten im Tabellenaufbau gibt. Diese sind umgehend zu korrigieren und die Form anzupassen.

Ab jetzt kann die Db mit realen (passenden)  Daten (manuell über die Forms) gefüllt und die Funktionsweise des Zusammenspiels getestet werden.

Passt jetzt alles zusammen, sind Auswertungen und Berechnungen, auch KTAs eher ein Kinderspiel als eine Herausforderung.

Und zu guter Letzt:  Verzichte auf Makros, Nachschlagefelder, Anlagen- und Mehrwert-Felder  in Tabellen.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ebs17

In Kurzform:
ZitatSELECT
   qyrPA_Personal_Kreuz.Name,
   qyrPA_Personal_Kreuz.Betrachtungsjahr,
   qyrPA_Personal_Kreuz.[7_1 FwDV7 - Standortübung Atemschutz],
   qyrPA_Personal_Kreuz.[7_2 FwDV7 - Übung ASZ-Lenting],
   qyrPA_Personal_Kreuz.[7_3 FwDV7 - theoretische Einweisung Atemschutz],
   qyrPA_Ein_Personal_Kreuz.Brand
FROM
   qyrPA_Personal_Kreuz
      LEFT JOIN qyrPA_Ein_Personal_Kreuz
      ON qyrPA_Personal_Kreuz.Name = qyrPA_Ein_Personal_Kreuz.Name
         AND
      qyrPA_Personal_Kreuz.Betrachtungsjahr = qyrPA_Ein_Personal_Kreuz.Betrachtungsjahr
Zusätzlich über das errechnete Jahr verknüpfen. Dazu muss dieses Jahr bereits in den jeweiligen KTA vorhanden sein (im SELECT-Teil mitführen).

Ansonsten: Man kann sehen, dass Du mit viel Einsatz an die DB herangehst (ich messe das am Fortschritt in den Abfragen, die zwar noch deutlich unrund sind, aber wie gesagt deutlich "fortschreiten").
Allerdings fehlt es an Grundlagen, die für eine Nachhaltigkeit der DB notwendig sind. Das wird Dir ganz schnell auf die Füße fallen, u.a. auch eine Mithilfe anderer erheblich erschweren.

Ich würde mich also meinen Vorrednern anschließen. Grobe Baustellen:
- Datenmodell - es gibt keins
- Verknüpfung über Namenskürzel, diese kommen über Nachschlagefelder in Tabellen
Mit freundlichem Glück Auf!

Eberhard

mad

Hallo Zusammen,

erst mal Danke für die erbrachte Hilfe, funktioniert jetzt.

Zur DB ein paar Erklärungen:
Es handelt sich um eine DB für unsere Freiwillige Feuerwehr, also nichts kommerzielles.
Diese DB habe ich bereits 2003 begonnen und den Anforderungen entsprechend weiterentwickelt.
Dieses Thema (nicht gewollte Doppelte Werte in Abfrage) ist auch eines das es für uns erst seit diesem Jahr in dieser Aussageform gibt.
In der DB werden Feuerwehrmitglieder der Aktiven Truppe sowie Vereinsmitglieder, Einsätze und Übung verschiedener Arten, Schulungen, Lehrgänge, Wettbewerbe, Jugendfeuerwehr, Inventar, Dokumente erfaßt. Auch ein Kassenbuch gibt es dort.
Die DB besteht derzeit aus einem Frontend und vier Backends und umfaßt ca. 60 Tabellen, 185 Abfragen, 75 Berichte und 165 Formulare incl. UF.
Alle Tabellen sind mit den entsprechenden Beziehungen angelegt. Für diverse Felder (Orte, Straßen, Lehrgänge, Übungsthema, Einsatzarten, verwende ich Auswahlfelder. Ob die Primärschlüssel immer richtig sind, na ja!
Für diese kleine Muster-DB habe ich nur kurzfristig die Daten abgespeckt und zusammenkopiert, darum die fehlenden Beziehungen.
Seht es mir nach, ich bin mit Sicherheit kein Access-Profi. Bemühe mich steht Anregungen aufzunehmen, allerdings muß es auch den Aufwand rechtfertigen. Das mit dem Feldnamen ,,Name" werde ich noch ändern.
Vielen Dank nochmals für die konstruktive Unterstützung und Anregungen.

Gruß
mad

DF6GL

Hallo,

ZitatAlle Tabellen sind mit den entsprechenden Beziehungen angelegt

Das ist aber auch den vorhergehenden Ausführungen nicht ersichtlich.


ZitatFür diese kleine Muster-DB habe ich nur kurzfristig die Daten abgespeckt und zusammenkopiert, darum die fehlenden Beziehungen.

Das solltest Du bleiben lassen, es führt nur in die Irre und in der Regel zu falschen Vorschlägen/Lösungen oder zu Tricksereien.

Die Beziehungen sind nun mal essentiell für den Betrieb der DB und das Verständnis der Funktionsweise (nicht nur für Außenstehende).
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ebs17

Es wird schon Gründe geben, das eigene Werk derart zu verfremden. Die Gefahr des Abschreibens wird man wohl eher nicht zu diesen Gründen zählen dürfen.
Mit freundlichem Glück Auf!

Eberhard