Neuigkeiten:

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

Mobiles Hauptmenü

Komplexe Abfrage

Begonnen von it_ask_for_help, November 16, 2015, 13:49:33

⏪ vorheriges - nächstes ⏩

it_ask_for_help

Hallo Ihr Lieben,

als Anfänger auf dem Gebiet Access steh ich vor einem kleinen Problem:
Ich habe eine Tabelle die u.a. folgendes beinhaltet : PersonalID , Name, Eintrittsdatum, Austrittsdatum.

Nun ist das Problem, dass manche Personen mehrmals in dieser Liste auftauchen und ich muss die doppelten Werte erkennen und sie zu einer neuen Zeile zusammenfassen: Hier muss im Feld Eintrittsdatum der Frühste Zeitpunkt aus den Datensätzen stehen und im Feld Austritt analog der späteste Zeitpunkt.

Nach der Erstellung dieser neuen Zeile sollten dann die restlichen Dopplungen gelöscht werden.

Bisher habe ich lediglich die Erkennung der doppelten Namen:

SELECT PersonalID, Name, Eintrittsdatum, Austrittsdatum,
FROM Tabelle
WHERE PersonalID In (SELECT PersonalID FROM Tabelle As Tmp GROUP BY PersonalID, Name HAVING Count(*)>1  And Name = Tabelle.Name)
ORDER BY PersonalID, Name;


Vielen Dank schonmal für die Hilfe!

MaggieMay

#1
Hi,

du könntest vielleicht in einem ersten Schritt Eintritts- und Austrittsdatum aktualisieren und im zweiten dann die doppelten Datensätze entfernen.

zu 1)
Update Tabelle Set Eintrittsdatum = DMin("Eintrittsdatum","Tabelle","PersonalID=" & PersonalID), Austrittsdatum = DMax("Austrittsdatum","Tabelle","PersonalID=" & PersonalID)

zu 2)
DELETE DISTINCTROW T1.*
FROM   Tabelle AS T1
       INNER JOIN Tabelle AS T2
       ON  T1.PersonalID = T2.PersonalID
WHERE  T1.ID > T2.ID;

Freundliche Grüße
MaggieMay

it_ask_for_help

Vielen Dank für die schnelle Antwort!

also wenn ich das mit dem Inner Join mach, werde ich nach Parameterwert für T1 und T2 gefragt?  :-\


MaggieMay

Probier's nochmal, ich habe die Lösch-Abfrage nachträglich geändert.
Freundliche Grüße
MaggieMay

it_ask_for_help

Perfekt es funktioniert!

Habe noch in der Tabelle einen Index mit Autowert eingefügt:)
Vieeeelen Daaaank! :-*

it_ask_for_help

Hallo allerseits!

Eine kleine zusätzliche Frage zum Thema:
Ich habe in der Tabelle noch ein weiteres Feld mit Kostenstelle.
Wie kann ich bei der UPDATE Abfrage zusätzlich in jedem Feld die aktuellste Kostenstelle reinsetzen? Jedes Datum der Dopplungen hat nämlich eine unterschiedliche Kostenstelle und ich möchte letztendlich die, mit dem spätestens Austrittszeitpunkt haben !
Wie sieht dazu die SET Abfrage aus?

Vielen Dank schon mal:)

MaggieMay

Hallo,

das Aktualisieren der Kostenstelle könnte folgendermaßen klappen:
Update Tabelle
Set
Eintrittsdatum = DMin("Eintrittsdatum","Tabelle","PersonalID=" & PersonalID),
Austrittsdatum = DMax("Austrittsdatum","Tabelle","PersonalID=" & PersonalID),
Kostenstelle = (Select Kostenstelle From Tabelle Where xxx)


Ist nicht die Lösung, aber vielleicht hilft dir dieser Ansatz schon weiter.
Freundliche Grüße
MaggieMay

ebs17

#7
Vor dem Codieren könnte man über Feldinhalte nachdenken: Ist denn Austrittsdatum in allen Datensätzen komplett ausgefüllt (sprich auch aktuelle Mitarbeiter sind praktisch unwiderruflich gekündigt)?

Bei normalen aktuell aktiven Mitarbeitern (NULL bei Austritt) dürfte ja das MAX auf das Datum eine Fehlinformation erzeugen, bei der abgeleiteten Kostenstelle dann analog.

Daneben: Die Aktualisierungen und Löschungen erfolgen doch hoffentlich nur auf eine Kopie der Tabelle, sonst würde man vorhandene Informationen vernichten - und bei diesem schrittweisen Aufbau von Anforderungen könnte es sein, dass solche Informationen dann doch auch noch ausgewertet werden sollen. Also könnte man schlicht eine Auswahlabfrage auf die Ausgangstabelle erzeugen. Als Versuch dazu:
SELECT
   A.PersonalID,
   A.Name,
   B.MinEintritt AS Eintrittsdatum,
   C.Austrittsdatum,
   C.Kostenstelle
FROM
   (
      (
         SELECT
            PersonalID,
            Name
         FROM
            Tabelle
      ) AS A
         INNER JOIN
            (
               SELECT
                  PersonalID,
                  MIN(Eintrittsdatum) AS MinEintritt
               FROM
                  Tabelle
               GROUP BY
                  PersonalID
            ) AS B
            ON A.PersonalID = B.PersonalID
   )
   INNER JOIN
      (
         SELECT
            C1.PersonalID,
            C1.Austrittsdatum,
            C1.Kostenstelle
         FROM
            Tabelle AS C1
               INNER JOIN
                  (
                     SELECT
                        PersonalID,
                        MAX(Austrittsdatum) AS MaxAustritt
                     FROM
                        Tabelle
                     GROUP BY
                        PersonalID
                  ) AS C2
                  ON C1.C1.PersonalID = C2.C1.PersonalID
                     AND
                  C1.Austrittsdatum = C2.MaxAustritt) AS C
                  ON A.PersonalID = C.PersonalID

Mit freundlichem Glück Auf!

Eberhard

it_ask_for_help

Vielen Dank für die Antworten!
Nochmal zum Sachverhalt, es ist tatsächlich eine Kopie einer anderen Tabelle. Die Infos die gelöscht werden, müssen daher nicht mehr ausgewertet werden und können somit eig verschwinden   ;D

Wenn ich jetzt den Code wie ihn ebs17 beschrieben hat bei mir einfüge, fragt er nach den Parameter C1.C1.PersonalID und C2.C1.PersonalID..

aber ich möchte es eig echt so einfach wie möglich halten und idealerweise, wie der Ansatz von MaggieMay das mit einer Update Abfrage lösen. Da habe ich aber schon alles mögliche ausprobiert .. aber es klappt immer noch nicht :(

MaggieMay

Hi,

das ist sicherlich nur ein Tippfehler und das zweite "C1." kannst du jeweils entfernen.

Was die andere Lösung betrifft, so zeig doch mal, was du schon alles probiert hast.
Und beschreibe auch, was dabei heraus gekommen ist.
Freundliche Grüße
MaggieMay

it_ask_for_help

AHH Perfekt, wenn ich die C1 entferne, dann funktioniert das ganze! Aber durch den Select Befehl wird eben eine Ergebnistabelle angezeigt, was ich ja nicht möchte. Ich will ja dass sich die Strukturtabelle aktualisiert.

Gibt es da einen Weg den Befehl von ebs17 in meine Update Abfrage zu integrieren?

ebs17

Aus einer Auswahlabfrage kann man simpel eine Tabellenerstellungsabfrage erstellen, siehe Abfrageeditor und dessen Assistenten, oder per Hand:
SELECT ...
INTO NeueTabelle
FROM ...

Das dürfte schneller gehen.

Die Korrektur zu meinem obigen Fehler war richtig.
Mit freundlichem Glück Auf!

Eberhard