Neuigkeiten:

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

Mobiles Hauptmenü

aus 4 Spalten in Tabelle das jeweils jüngste Datum aussuchen

Begonnen von Grumpy, November 30, 2017, 10:09:37

⏪ vorheriges - nächstes ⏩

Grumpy

Ich habe ein Tabelle mit ID (dient als identifizierung mit anderen Tabellen) und 4 Spalten A - D in denen entweder ein Datum drin steht oder auch leer ist.
Jetzt möchte ich eine Abfrage (für einen Bericht) bei dem als Ausgabe für jeden Datensatz das jeweils jüngste Datum und der Spaltenname ausgegeben wird.
also z.B.
Id      Datum       Modul
3     22.10.2017   Modul A
8     12.07.2017   Modul D
99    22.12.1994  Modul C
......

Lachtaube

Die Ausgangslage ist ungünstig.  :( Du kannst eine Vereinigungsabfrage erstellen, in der Du jedem Datumswert mitteilst, von welcher ursprünglichen Spalte in der der Tabelle (nenne ich im weiteren einfach T) er stammt.

SELECT id, a AS Datum, "Modul A" AS Modul FROM T WHERE a Is Not Null
UNION ALL
SELECT id, b, "Modul B" FROM T WHERE b Is Not Null
UNION ALL
SELECT id, c, "Modul C" FROM T WHERE c Is Not Null
UNION ALL
SELECT id, d, "Modul B" FROM T WHERE d Is Not Null;

Spaltennamen in Abfragetext ggf. an Deine Gegegebenheiten im Text anpassen und den Code in die SQL-Ansicht einer neuen Abfrage kopieren und testen. Das war Schritt 1.

Diese Abfrage muss erneut abgefragt werden, um das höchste Datum je id zu erheischen. Dazu das Summensymbol (Sigma) im Band oben anklicken und id als auch Datum als Feld in die Abfrage aufnehmen. Bei id sollte unter Funktion Gruppierung und bei Datum die Funktion Maximum stehen.

Schritt 3: Nimm Abfrage 1 und Abfrage 2 in eine neue Abfrage auf. Ziehe Verknüpfungslinien jeweils zwischen der id und zwischen dem Datum auf. Danach wählst Du alle Felder aus der 1. Abfrage aus und solltest das Wunschresultat vorliegen haben.

Bei größerem Datenbestand ist mit Wartezeiten bei der Ausführung zu rechnen. Sollte das der Fall sein, solltest Du bestrebt sein, die Ausgangstabelle so zu organisieren, wie es die Abfrage 1 ausgibt. Dabei könnte man noch statt dem Text im Feld Modul einen Fremdschlüssel von einer Tabelle mit zwei Feldern einsetzen, die die vier Module in vier Datensätzen beschreibt.
Grüße von der (⌒▽⌒)

Grumpy

ist ja fast wie eine Doktorarbeit....
Hab soweit die Abfragen erstellt aber....
es wird zwei mal nach a b c d gefragt
geb ich da nichts ein...ist die Ausgabe ohne ergebniss
geb ich irgendwas ein(egal ob Zahl oder Datum) ....gibt es für jede ID nicht nur das jüngstes Modul sondern alle
bsp:
ID         Datum            Modul
7          10.10.2017      Modul A
7          14.12.2017     Modul B
66         01.01.2015     Modul A
66         05.12.2018     Modul D

schön wäre aber je ID eine Zeile mit dem Datum und dem jüngsten Modul

Die Tabelle heist tab_Einsatzhelfer
mit den Spalten
Modul_A, Modul_B.....Modul_C
und als Wert wird das Datum eingetragen

DF6GL

#3
Hallo,

aus DbWiki.net  und etwas modifiziert:

Public Function fktMaxDat(ParamArray P())
' Maximum
Dim V, I As Long, Spalte As Long
  V = 0
  For I = LBound(P) To UBound(P)
    If (P(I) > V) Then
       V = CDate(P(I))
       Spalte = I + 1
    End If
  Next I
  fktMaxDat = Format(V, "dd.mm.yyyy") & ", " & Choose(Spalte, "Modul A", "Modul B", "Modul C", "Modul D")
End Function



Aufruf:


Select * , fktMaxDat ([Modul_A],[Modul_B],[Modul_C],[Modul_D])  from tab_Einsatzhelfer
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

Grumpy


Lachtaube

Grüße von der (⌒▽⌒)

MzKlMu

Hallo,
der Einwand von Lachtaube scheint mir untergegangen zu sein.
Zitat von: LachtaubeDie Ausgangslage ist ungünstig. 
Mit einem normalisierten Aufbau der Tabelle wäre der ganze Aufwand gar nicht nötig.
Die Moduldatumswerte als je ein Datensatz mit einem Kennzeichen für das Modul in einer extra Tabelle würde die Aufgabe zu einem Kinderspiel machen.

Wollte ich nur noch erwähnt haben.
Gruß Klaus

Beaker s.a.

Hallo,
Zitatist ja fast wie eine Doktorarbeit....
Liegt wohl am angedeuteten suboptimalen Datenmodell.
Mit einer tab_Module und einer Zwischentabelle tab_Helfer_Module
erhält man aus den Beispieldaten mit dieser Abfrage
SELECT
    Q.HelferID_F,
    Q.ModDatum,
    M.ModulName
FROM tab_Module AS M
     INNER Join
          (
            SELECT
                HM.HelferID_F,
                HM.ModulID_F,
                HM.Moddatum
            FROM tab_Helfer_Module AS HM
                INNER Join
                        (
                          SELECT HMU.HelferID_F,
                                 Max(HMU.Moddatum) As ModulDatum
                          FROM tab_Helfer_Module AS HMU
                          GROUP BY HMU.HelferID_F
                         ) AS M
                ON (HM.Moddatum = M.ModulDatum) AND (HM.HelferID_F = M.HelferID_F)
          ) AS Q
    ON M.ModulID = Q.ModulID_F

das gewünschte Ergebnis
7   14.12.2017   Modul B
66   05.12.2018   Modul D

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

Hallo,


bei der VBA-Lösung:

ZitatBei dem Aufruf meckert er aber wegen dem *

Das ist ein SQL-String, sprich Abfrage und kein VBA-Code....
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