Versio

SELECT laatste uurtarief

Overzicht Reageren

Barman V

Barman V

25/10/2006 10:49:00
Quote Anchor link
Beste lezers,

Het lijkt een erg eenvoudige query, maar ik kom er niet uit.

Zie hier een voorbeeld inhoud van de tabel "tarief".
Deze tabel is gekoppeld aan de tabel "functie" (functie.functieID = tarief.functieID)
Waarom uurtarief niet gewoon in tabel functie? => Stel dat het uurTarief voor een functie aangepast wordt, moet de historie met het oude tarief natuurlijk nog kloppen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
functieID    |    uurTarief    |    ingangsdatum
1            150.00            23-11-2004
1            155.00            18
-05-2005
2            120.00            09
-02-2004
1            175.00            19
-07-2006
3            120.00            21
-10-2006
2            135.00            12
-04-2004
?>

Graag wil ik de huidige uurtariefen selecteren, dus wil ik het volgende resultaat:

1 | 175.00 | 19-07-2006
2 | 135.00 | 12-04-2004
3 | 120,00 | 21-10-2006

Simpel gezegt: Ik wil alle uurtariefen met de laatste ingangsdatum

Ik heb verschillende query's geprobeerd, maar kom er niet uit.

Dit werkt bijvoorbeeld niet
SELECT functieID, uurTarief, MAX(ingangsdatum)
FROM tarief
GROUP BY functieID

Nu selecteert hij wel de laatste ingangsdatum, maar toont niet de juiste uurTarief.

Wie kan mij helpen?

Alvast bedankt
Gewijzigd op 01/01/1970 01:00:00 door Barman V
 
PHP hulp

PHP hulp

25/05/2012 15:30:14
Gesponsorde koppelingen:
 
Jeroen Jansen

Jeroen Jansen

25/10/2006 11:46:00
Quote Anchor link
Werkt volgens mij het beste door de MAX in een sub-query te bepalen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
  a.functieID,
  a.uurTarief,
  a.ingangsdatum
FROM
  tarief a
WHERE
  a.ingangsdatum = (SELECT
                      MAX(b.ingangsdatum)
                    FROM
                      tarief b
                    WHERE
                      a.functieID = b.functieID)
Gewijzigd op 01/01/1970 01:00:00 door Jeroen Jansen
 
Robert Deiman

Robert Deiman

25/10/2006 11:55:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
   a.functieID,
   a.uurTarief,
   a.ingangsdatum,
   MAX(a.ingangsdatum) as nieuwste
FROM
   tarief a
GROUP BY
   a.functieID
HAVING
   a.ingangsdatum = nieuwste


En zo?
 
Klaasjan Boven

Klaasjan Boven

25/10/2006 12:25:00
Quote Anchor link
En pas anders je tabellen even aan:

tabel_functie
id
functie

tabel_tarief
functie_id
uurtarief
datum_ingang
datum_eind

je querie wordt dan
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
   a.functie_id,
   a.functie,
   b.uurtarief
FROM
  functies a,
  tarief b
WHERE
  a.functie_id=b.functie_id
AND
  b.datum_einde=' '


Volgens mij is dat de beste oplossing
 
Barman V

Barman V

25/10/2006 12:31:00
Quote Anchor link
Bedankt voor de reacties.

@Jeroen:
Helaas draait de webserver op SQL 4.0 en niet 4.1, dus kan geen subquery's aanmaken.

@Robert:
Lastig uit te leggen, maar werkt ook niet. De ingangsdatum is niet altijd gelijk aan de "nieuwste", zoals je in de HAVING neerzet. Als er meerdere ingangsdata bestaan voor een functieID, dan pakt hij gewoon de eerste ingangsdatum (want je groepeerd) en hij pakt de MAX ingangsdatum. Dit is dus niet gelijk.
 
Barman V

Barman V

25/10/2006 12:39:00
Quote Anchor link
@Jeroen:
Maar je query werkt wel. Dit is precies wat ik wil hebben, maar de server ondersteunt het niet :(. Misschien zal ik het een en ander gaan voorstellen.

@Klaasjan:
Ik begrijp wat je bedoelt, maar toch vind ik de einddatum overbodig. Overbodigheid lijdt dan weer tot inconsistentie. Je zit dan met 2 data te knoeien die goed op elkaar moeten aansluiten.
Ik zal er over nadenken, want het is wel een oplossing.
 
Jan Koehoorn

Jan Koehoorn

25/10/2006 12:45:00
Quote Anchor link
Even een gokje:

SELECT MAX( ingangsdatum ) AS laatste_wijziging, uurTarief
FROM tarief
GROUP BY uurTarief
 
Klaasjan Boven

Klaasjan Boven

25/10/2006 12:45:00
Quote Anchor link
Barman schreef op 25.10.2006 12:39:
@Jeroen:
.....
@Klaasjan:
Ik begrijp wat je bedoelt, maar toch vind ik de einddatum overbodig. Overbodigheid lijdt dan weer tot inconsistentie. Je zit dan met 2 data te knoeien die goed op elkaar moeten aansluiten.
Ik zal er over nadenken, want het is wel een oplossing.....


Volgens mij is dat juist de manier om historie te bewaren.
Je kunt deze nu altijd beeindigen met UPDATE bla SET datum_einde=NOW())
 
Robert Deiman

Robert Deiman

25/10/2006 13:08:00
Quote Anchor link
Barman schreef op 25.10.2006 12:31:
@Robert:
Lastig uit te leggen, maar werkt ook niet. De ingangsdatum is niet altijd gelijk aan de "nieuwste", zoals je in de HAVING neerzet. Als er meerdere ingangsdata bestaan voor een functieID, dan pakt hij gewoon de eerste ingangsdatum (want je groepeerd) en hij pakt de MAX ingangsdatum. Dit is dus niet gelijk.


Ik weet niet of je het hebt getest, maar volgens mij pakt die door de group by elke keer de hoogste datum van een bepaald ID..
Als ik het goed heb (zelf niet getest) dan pakt die een id, van die ID de hoogste datum, en dan daarvan de prijs.

Wat je zei over de ingangsdatum gebruik je toch gewoon de MAX ingangsdatum in je echo, tenminste als die wel de juiste gegevens selecteerd.

(nogmaals ik heb het zelf niet getest)
 
Barman V

Barman V

25/10/2006 13:35:00
Quote Anchor link
Nogmaals dank.

@Jan:
Getest, maar ik moet niet op uurtarief groeperen, omdat dat juist steeds verschilt. Het moet echt per functie zijn (per functie de huidige tarieven)

@Klaasjan:
Je hebt wel gelijk. Maar ik wil niet graag met periodes werken, tenzij het gaat om aantoonbare start en einddatum (bijv. deadlines bij een project). Op deze manier moeten alle data op elkaar aansluiten, dit vind ik toch iets te riskie.
Toch lijkt mij jouw manier wel het beste en zal ik deze wel gaan toepassen, bedankt.

@Robert:
Ik had het wel getest (dit doe ik altijd).
Jij zegt:
Als ik het goed heb (zelf niet getest) dan pakt die een id, van die ID de hoogste datum, en dan daarvan de prijs.

Nee, dat is het rare. Hij toont (door het groeperen) niet de hoogste prijs bij de MAX datum. Dat is het probleem. Hij toont de eerste tarief dat ie vind, met de MAX ingangsdatum.
 
Frank -

Frank -

25/10/2006 14:09:00
Quote Anchor link
@Robert:
Quote:
Ik weet niet of je het hebt getest, maar volgens mij pakt die door de group by elke keer de hoogste datum van een bepaald ID..
Als ik het goed heb (zelf niet getest) dan pakt die een id, van die ID de hoogste datum, en dan daarvan de prijs.
En dit is een grove fout van MySQL!

Met het gebruik van GROUP BY geef jij aan dat je de eigenschappen van een bepaalde groep records wilt opvragen. De datum die jij echter wilt opvragen, is geen eigenschap van deze hele groep, maar van een individueel record. Dat gaat dus niet lukken, de database hoort daar ook een foutmelding op te geven. Helaas doet MySQL een gok welke gegevens jij vandaag op het scherm wilt zien... Dat kan dus per keer verschillen. Ik weet het niet zeker, maar volgens mij is er een verband met de laatst aangemaakte records, de auto_increment. Het is in elk geval fout en ga hier dus nooit mee werken, het levert uiteindelijk problemen op.
 



Overzicht Reageren