Toon posts:

[SQL] Waardes vergelijken?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De Code:

SELECT AutoTB.AutoIDKey, BronTabelMerk.Merk, BronTabelModel.Model, Persoonsgegevens.Naam,
AutoTB.Kenteken, Rijperiode.BeginDatum FROM AutoTB

LEFT JOIN BronTabelMerk ON AutoTB.MerkKey = BronTabelMerk.MerkKey
LEFT JOIN BronTabelModel ON AutoTB.ModelKey = BronTabelModel.ModelKey
LEFT JOIN Rijperiode ON Rijperiode.AutoIDKey= AutoTB.AutoIDKey
LEFT JOIN Medewerker ON Rijperiode.medewerkerKey = Medewerker.MedewerkerKey
LEFT JOIN Persoonsgegevens On Medewerker.PersoonsgegevensKey=Persoonsgegevens.PersoonsgegevensKey
LEFT JOIN Contract ON Contract.AutoIDKey = AutoTB.AutoIDKey
LEFT JOIN Verzekering ON Verzekering.AutoIDKey = AutoTB.AutoIDKey
LEFT JOIN Eigenaar ON Contract.EigenaarKey = Eigenaar.EigenaarKey
LEFT JOIN Tankpas ON Tankpas.AutoIDKey = AutoTB.AutoIDKey
LEFT JOIN schade ON Rijperiode.RijperiodeKey = Schade.RijperiodeKey

WHERE ((@Kenteken IS NULL) OR (AutoTB.Kenteken LIKE @Kenteken + '%')) AND
((@Medewerker IS NULL) OR (Persoonsgegevens.Naam LIKE @Medewerker + '%')) AND ((@LeaseCategorieKey IS NULL) OR (AutoTB.LeaseCategorieKey = @LeaseCategorieKey))
AND ((@MerkKey IS NULL) OR (AutoTB.MerkKey = @MerkKey))
AND ((@Sleutelnummer IS NULL) OR (AutoTB.Sleutelnummer LIKE @Sleutelnummer + '%'))
AND ((@ModelKey IS NULL) OR (AutoTB.ModelKey = @ModelKey))
AND ((@KleurKey IS NULL) OR (AutoTB.KleurKey = @KleurKey))
AND ((@Beschikbaarheid IS NULL) OR (AutoTB.Beschikbaarheid = @Beschikbaarheid)) AND ((@Bestickering IS NULL) OR (AutoTB.Bestickering = @Bestickering))
AND ((@EnergieLabelKey IS NULL) OR (AutoTB.EnergieLabelKey = @EnergieLabelKey)) AND ((@BijtellingspercentageKey IS NULL) OR (AutoTB.BijtellingspercentageKey = @BijtellingspercentageKey))
AND AutoTB.InBehandeling = 0
AND Contract.InBehandeling = 0
AND Tankpas.InBehandeling = 0
AND Verzekering.Inbehandeling = 0

GROUP BY AutoTB.AutoIDKey, BronTabelMerk.Merk, BronTabelModel.Model, Persoonsgegevens.Naam, AutoTB.Kenteken , Rijperiode.BeginDatum

END

---


Het resultaat van bovenstaande code is bijvoorbeeld:

[AutoIDKey] [Merk] [Model] [Naam] [Kenteken] [BeginDatum]
140 Opel Astra Jan 00-AAA-3 01-01-2008
140 Opel Astra Ruud 00-AAA-3 01-01-2009
145 Volvo C70 Bart 88-BBB-6 01-05-2008

Nu wil ik het zo hebben, dat als een auto meerdere eigenaren heeft gehad (in dit geval dus Ruud en Jan), alleen degene getoond wordt met de laatste BeginDatum. Dus:

[AutoIDKey] [Merk] [Model] [Naam] [Kenteken] [BeginDatum]
140 Opel Astra Ruud 00-AAA-3 01-01-2009
145 Volvo C70 Bart 88-BBB-6 01-05-2008

Is het mogelijk om bijvoorbeeld de AutoIDKey's te vergelijken en wanneer een AutoIDKey meerdere keren voorkomt, het zo in te stellen dat alleen de laatste BeginDatum getoond wordt?

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Het eerst wat in mij opkomt: Group By. Vervolgens een max functie over je datum veld.

Meer info:
GroupBY: http://www.w3schools.com/sql/sql_groupby.asp
Max func: http://www.techonthenet.com/sql/max.php

Wat je ook nog zou kunnen doen als de sql query gewoon te groot wordt: Eenmalig een view maken en daar vervolgens die groupby en max overheengooien.

Succes!

[ Voor 45% gewijzigd door BlackHawkDesign op 03-03-2009 11:20 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je zoekt een groupwise maximum.

Zie bovenstaande links voor de basics en vervolgens: http://jan.kneschke.de/projects/mysql/groupwise-max voor verschillende aanpakken van een groupwise max. Done.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met een Max function heb ik het al eens geprobeerd, maar dan kreeg ik steeds alleen het record met de laatste BeginDatum. Is het ook mogelijk om de max function alleen los te laten op de resultaten die overeenkomen?

Rijperiode.BeginDatum IN
(SELECT MAX(Rijperiode.BeginDatum) AS BeginDatum
FROM Rijperiode
WHERE ?????? - misschien mogelijk om iets te zeggen in de trant van 'waar AutoIDKey's overeenkomen'?

Edit: Bedankt Voutloos. Ik ga het eens proberen!

[ Voor 5% gewijzigd door Verwijderd op 03-03-2009 11:29 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom wordt in de contract tabel niet bijgehouden welke contracten nog actief zijn? Het contract uit 2008 is niet meer actief, aangezien er nu een andere persoon in de auto rijd..

offtopic kun je de query nog verder te optimaliseren door de where clausule al zo veel mogelijk op te nemen in de join clausules je koppelt nu alle tabellen aan elkaar en daarna wordt er pas gefiltert, terwijl als je al filtert op de join je al begint met minder gegevens.

Daarnaast begrijp ik niet helemaal waarom je een group by gebruikt aangezien je nergens aggregate functies gebruikt of een having clausule.

[ Voor 0% gewijzigd door Niemand_Anders op 03-03-2009 16:21 . Reden: zinsopbouw eerste paragraaf ]

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zou je in de TS de Query in een code blok ([code=sql]... [/code]) kunnen zetten, en een beetje aan Identing doen? Ook je tabel graag even opmaken met [Table], dan is je TS tenminste een beetje te lezen.

Ik vind ook je TS wel erg mager, het lijkt wel erg op het dumpen van je code, en maar hopen dat iemand je een kant en klare oplossing bied. Let daar in het vervolg ieder geval een beetje op.

[ Voor 4% gewijzigd door Woy op 03-03-2009 12:16 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op dinsdag 03 maart 2009 @ 12:08:
Ik vind ook je TS wel erg mager, het lijkt wel erg op het dumpen van je code, en maar hopen dat iemand je een kant en klare oplossing bied. Let daar in het vervolg ieder geval een beetje op.
Ow sorry, dat was niet mijn bedoeling.

Bedankt voor de hulp allemaal. Met een groupwise max is het gelukt. :)
Pagina: 1