Record met laatste datum ophalen

  • Onderwerp starter Onderwerp starter ivdh
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

ivdh

Gebruiker
Lid geworden
2 jun 2004
Berichten
54
Ik heb een tabel met daarin deze gegevens

Id, VergunningId, DatumRealisatie
105, 59, 2003-10-12
112, 59, 2004-02-20
113, 59, null
114, 60, 2004-02-10
115, 60, null
116, 61, null
etc.

Ik wil nu via een query alleen de laatste controle getoond krijgen (of als er nog geen controle is geweest het ene record dat in de lijst staat.

dus dit:
112, 59, 2004-02-20
114, 60, 2004-02-10
116, 61, null

Dat heb ik met deze query geprobeerd, maar dan krijg ik nog steeds alles.

SELECT Id, VergunningId, Last([DatumRealisatie]) AS LaatsteToezicht
FROM TabelVergunningToezicht
GROUP BY Id, VergunningId
ORDER BY VergunningId
 
Je moet niet groeperen op Id, als je dit doe krijg je alles te zien.

Dus:

SELECT VergunningId, Last([DatumRealisatie]) AS LaatsteToezicht
FROM TabelVergunningToezicht
GROUP BY VergunningId
ORDER BY VergunningId


Als ik je verhaal lees denk ik trouwens dat je in plaats van LAST de functie MAX moet hebben. Maar dat is afhankelijk van wat je precies wilt.
 
Ik heb laatste door max gewijzigd en ik krijg nu veel meer data te zien, dus ik denk inderdaad dat ik die moet hebben.

bEDANKT!

Maar is het ook mogelijk om toch Id ook op te nemen, want eigenlijk heb ik die wel nodig.
 
Maak een tweede query gebasseerd op de eigenlijke tabel en de vorige query. Gebruik als relatie de velden

VergunningId en LaatsteToezicht
 
Het ligt ongetwijfeld aan mij, maar ik krijg het niet voor elkaar om het juiste resultaat te krijgen. Als ik deze query en en "basis-tabel" gebruik ik bij de velden waarbij de datumrealisatie niet is ingevuld geen gegevens gekoppeld.
 
Stuur even je voorbeeld.
Alleen de betreffende tabel is voldoende.
 
Het probleem is dat de velden waar geen datum in staan de waarde NULL hebben.
En in deze gevallen vind de tweede query er geen TaakId bij.
Je zou de velden waar geen datum in kunnen vullen met bijvoorbeeld 01-01-3000. Dan staat staat er toch iets in het veld.

In je tabel staan die datum velden trouwens gedefinieerd als "text" veld. Je kan hier beter een datumveld van maken. Dan kan je niet per ongeluk 34-01-2004 invullen.
 
De velden zijn bewust als tekstveld gedefinieerd omdat ik anders de datum niet kan opslaan in het formaat yyyy-mm-dd.

Ik heb de Null-velden vervangen en nu werkt het inderdaad wel.

THANKS!
 
Je kunt bij de tabel definitie heel eenvoudig de opmaak van het datumveld aanpassen.


Grtz,
 
Ik heb nu alle datumvelden met een 0 gevuld daar waar nodig. Wanneer nu mij query en de tabel aan elkaar koppel krijg ik het TaakId te zien. Da's dus goed.

Heb ik nog 1 probleempje. In de query staat 601 records en in het resultaat 657. Dat zijn er dus 56 teveel. Hoe kan ik dit voorkomen? Het zijn zowel records waar wel als geen datum is ingevuld.
 
Als je de query plaatst in SQL view en de tekst daarvan even post op hetr forum dan kunnen we wellicht de oorzaak achterhalen.


Grtz,
 
SELECT QryLaatsteToezicht.VergunningId, QryLaatsteToezicht.LaatsteToezicht, TabelVergunningToezicht.TaakId
FROM QryLaatsteToezicht LEFT JOIN TabelVergunningToezicht ON (QryLaatsteToezicht.LaatsteToezicht = TabelVergunningToezicht.DatumRealisatie) AND (QryLaatsteToezicht.VergunningId = TabelVergunningToezicht.VergunningId);
 
De LEFT JOIN zorgt ervoor dat alle resultaten uit de query QryLaatsteToezicht voorkomen in het uiteindelijke resultaat, of er nu wel of geen record wordt gevonden in de tabel TabelVergunningToezicht.

Volgens mij heb je hier geen Left Join nodig, omdat de query al gebaseerd is op dezelfde tabel. Probeer hetvolgende is:

Code:
SELECT 
  q.VergunningID,
  q.LaatsteToezicht, 
  t.TaakId
FROM
  QryLaatsteToezicht q,
  TabelVergunningToezicht t
WHERE
  q.LaatsteToezicht = t.DatumRealisatie AND
  q.VergunningId = t.VergunningId;

Met bovenstaande query krijg je nooit meer resultaten dan er in QryLaatsteToezicht staan.

Je hebt kans dat als je dit in access plakt en het resultaat bekijkt dat Access de query omschrijft naar een access variant. Maar het moet in ieder geval werken.

Als het niet werkt moet je ook de SQL van QryLaatsteToezicht eens plaatsen.


Grtz,
 
Ook met deze sql krijg ik 657 resultaten ipv 601.
 

Bijlagen

  • db.zip
    db.zip
    41,8 KB · Weergaven: 17
Als je Tussen SELECT en het eerste veld het woord DISTINCT zet heb je nog maar 605 records over. Dan heb je nog 4 probleemgevallen. En dat zijn gevallen die je niet met een query kunt oplossen.

Een van de probleemgevallen is vergunningID 299. Die is twee keer ingevoerd met een datumplanning en beide keren niet gerealiseerd. Dat levert dus twee keer hetzelfde resultaat op.

Het probleem zit in het datamodel van de database. Het relationele model daarvan klopt niet helemaal. Hoe dat exact in elkaar steekt kan ik niet beoordelen omdat niet het hele schema in de database zit.

Al met al een pittig probleempje dus...


Grtz,
 
Als je Tussen SELECT en het eerste veld het woord DISTINCT zet heb je nog maar 605 records over. Dan heb je nog 4 probleemgevallen. En dat zijn gevallen die je niet met een query kunt oplossen.

Een van de probleemgevallen is vergunningID 299. Die is twee keer ingevoerd met een datumplanning en beide keren niet gerealiseerd. Dat levert dus twee keer hetzelfde resultaat op.

Het probleem zit in het datamodel van de database. Het relationele model daarvan klopt niet helemaal. Hoe dat exact in elkaar steekt kan ik niet beoordelen omdat niet het hele schema in de database zit.

Al met al een pittig probleempje dus...


Grtz,
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan