WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   SQL-Abfragen / Access: Frage zu Abfragen (http://www.wcm.at/forum/showthread.php?t=242298)

webwurm 16.06.2011 13:57

SQL-Abfragen / Access: Frage zu Abfragen
 
Hallo liebe Foren-Teilnehmer!

Ich steh bei einem Problem mit SQL/MS Access irgendwie auf der Leitung und hoffe, dass ihr mir bei einer (sicherlich einfachen) Aggregatfunktion helfen könnt.

Ausgangslage:
Ich habe eine Tabelle „tblKunden“ mit einer Schlüsselspalte „IDKunde“ und dem Namen der Kunden:

Code:


tblKunden
--------------
IDKunde: Integer
VollerName: String


Weiters gibt es eine Tabelle „tblKontostand“, in der zu jedem Kunden zu verschiedenen Daten ein Kontostand hinterlegt ist:

Code:


tblKontostand
--------------
IDKontostand: Integer (eindeutiger Bezeichner)
Datum: Datum des Kontostands
Kontostand: Höhe des Kontostands


Ziel
----
Ich versuche nun, eine Abfrage/Sicht zu erhalten, bei der ich die KundenID, den Kundenname und den Kontostand zum letztmöglichen Datum erhalte. Also pro Kunde die Zeile:

IDKunde, Vollername, Datum, Kontostand

Irgendwie steh ich auf der Leitung, da alle meine Gruppierungsversuche in SQL scheitern…

Mich würde es sehr freuen, wenn mir jemand helfen könnte!

Vielen Dank im Voraus,
webwurm

pc.net 16.06.2011 17:03

Nach deiner Angabe fehlt in der Kontostands-Tabelle die Referenz zum Kunden ;) . Ich gehe beim folgenden Statement aber davon aus, dass der Fremdschlüssel IDKunde bei jedem Konto vorhanden ist. Außerdem beziehe ich die Möglichkeit mit ein, dass es zu einem Kunden mehrere Konten geben kann (nicht so unüblich ;) ).

Code:

select kd.IDKunde,
      kd.VollerName,
      ko.Datum,
      ko.Kontostand
from tblKunden kd,
    tblKontostand ko
where ko.IDKunde = kd.IDKunde
  and ko.Datum = (select max(ko2.Datum)
                  from tblKontostand ko2
                  where ko2.IDKunde = kd.IDKunde
                    and ko2.IDKontostand = ko.IDKontostand
                )
;


Disclaimer: Diese Abfrage sollte ANSI-SQL sein und auch unter Access funktionieren. Unter Oracle geht sie definitiv.

pong 17.06.2011 05:41

Code:

select kd.IDKunde,
      kd.VollerName,
      ko.Datum,
      ko.Kontostand
from tblKunden kd,
    tblKontostand ko
where ko.IDKunde = kd.IDKunde
  and ko.Datum = (select ko2.Datum
                  from tblKontostand ko2
                  where ko2.IDKunde = kd.IDKunde
                    and ko2.IDKontostand = ko.IDKontostand
                  order by ko2.datum desc
                  fetch first 1 row only
                )
;

Alternative zur Aggregatfunktion.

pong

webwurm 20.06.2011 11:28

Vielen herzlichen Dank für die Antworten!
Den Fremdschlüssel gibt es natürlich - sorry...

Ich habe es nun so umgesetzt:
Code:


SELECT tblKunden.IDKunde, tblKunden.VollerName, tblKontostand.IDKontostand, tblKontostand.Datum, tblKontostand.Kontostand
FROM tblKunden INNER JOIN tblKontostand
ON tblKunden.IDKunde = tblKontostand.IDKunde
Where tblKontostand.Datum = DMAX("Datum", "tblKontostand", "IDKunde=" & tblKunden.IDKunde)

Danke und lg,
webwurm


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag