[SQL] Selectie van contracten in een periode

Pagina: 1
Acties:

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 00:13
In een tabel Contract staan o.a. de volgende gegevens vermeld:
- ContractID
- MedewerkerID
- Begindatum

Let op: De tabel bevat GEEN einddatum, deze kan worden achterhaald aan de hand van de begindatum van het eerstvolgende contract.

Ik wil door middel van SQL een overzicht krijgen van alle contracten die in augustus geldig zijn. Daarvoor heb ik inmiddels de volgende query:

code:
1
2
3
4
5
6
7
8
SELECT ContractID, Begindatum FROM Contract 
WHERE Begindatum > #08/01/2002# 
AND Begindatum <= #08/31/2002#
UNION
SELECT ContractID FROM Contract WHERE ContractID IN (
     SELECT TOP 1 ContractID FROM Contract
     WHERE Begindatum <= #08/01/2002# 
    ORDER BY Begindatum DESC)


Deze query selecteert alle contracten die zijn ingegaan in augustus + het laatst geregistreerde contract dat geldig was op 1 augustus. Ik wil echter alle contracten te zien krijgen, die geldig zijn op 1 augustus.

Weet iemand hoe ik dit dmv SQL voor elkaar krijg?

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 09:11
Het gedeelte 'TOP 1' eruit slopen ??

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 00:13
maikel schreef op 21 augustus 2002 @ 12:05:
Het gedeelte 'TOP 1' eruit slopen ??
Als ik "TOP 1" eruit haal, dan krijg ik ook alle contracten die voor augustus geldig waren en voor augustus zijn beeindigd. Ik moet dus een overzicht krijgen van alle contracten die voor of op 1 augustus zijn geregistreerd, maar welke NIET zijn opgevolgd door een contract (van dezelfde medewerker of course... :) ) dat voor 1 augustus is ingegaan.

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 09:11
TweakersOnly schreef op 21 augustus 2002 @ 12:09:
[...]

Als ik "TOP 1" eruit haal, dan krijg ik ook alle contracten die voor augustus geldig waren en voor augustus zijn beeindigd. Ik moet dus een overzicht krijgen van alle contracten die voor of op 1 augustus zijn geregistreerd, maar welke NIET zijn opgevolgd door een contract (van dezelfde medewerker of course... :) ) dat voor 1 augustus is ingegaan.
Het leek mij al te simpel zo. :)
Maar die 'TOP 1' moet er volgens mij toch echt uit. Je moet alleen je WHERE-clause wat uitbreiden. Ik weet alleen niet hoe omdat ik zo niet weet hoe je database in elkaar steekt.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Moet je er ook nog begindatum = 1 augustus van maken natuurlijk...
Maar waarom maak je van je eerste check op begindatum niet gelijk al <= ??

Volgens mij is je UNION namelijk helemaal niet nodig.

Humm, misschien niet, maar dan moet je wel iets beter uitleggen wat je _wilt_ selecteren, ipv wat je nu selecteerd.

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 00:13
ACM schreef op 21 augustus 2002 @ 12:26:
Moet je er ook nog begindatum = 1 augustus van maken natuurlijk...
Maar waarom maak je van je eerste check op begindatum niet gelijk al <= ??

Volgens mij is je UNION namelijk helemaal niet nodig.

Humm, misschien niet, maar dan moet je wel iets beter uitleggen wat je _wilt_ selecteren, ipv wat je nu selecteerd.
Ik wil alle contracten van alle verschillende medewerkers selecteren die geldig zijn in de maand augustus. Daarvoor selecteer ik allereerst alle contracten die na 1 augustus en voor 1 september geregistreerd.

Daarnaast moet ik alle contracten selecteren die geldig zijn op 1 augustus. Deze contracten kunnen dus ingegaan zijn op 1 augustus zelf of op een dag voorafgaande aan 1 augustus. In feite dus:

Selecteer het grootste contract per medewerker, waarvan de ingangsdatum van het contract kleiner of gelijk is aan 01/08/2002.

Hopelijk is het nu een stuk duidelijker :)

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 09:11
ACM schreef op 21 augustus 2002 @ 12:26:
Moet je er ook nog begindatum = 1 augustus van maken natuurlijk...
Maar waarom maak je van je eerste check op begindatum niet gelijk al <= ??

Volgens mij is je UNION namelijk helemaal niet nodig.

Humm, misschien niet, maar dan moet je wel iets beter uitleggen wat je _wilt_ selecteren, ipv wat je nu selecteerd.
Met 'begindatum = 1 augustus' krijgt hij alleen de contracten die gestart zijn op 1 augustus en hij wil alle contracten van VOOR of OP 1 augustus. Maar dan alleen de contracten die nog geldig zijn op 1 augustus.

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 00:13
maikel schreef op 21 augustus 2002 @ 12:34:
Met 'begindatum = 1 augustus' krijgt hij alleen de contracten die gestart zijn op 1 augustus en hij wil alle contracten van VOOR of OP 1 augustus. Maar dan alleen de contracten die nog geldig zijn op 1 augustus.
Jij snapt me. :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

maikel schreef op 21 augustus 2002 @ 12:34:
Met 'begindatum = 1 augustus' krijgt hij alleen de contracten die gestart zijn op 1 augustus en hij wil alle contracten van VOOR of OP 1 augustus. Maar dan alleen de contracten die nog geldig zijn op 1 augustus.

Dat weet ik, maar toen ik dat vroeg was de uitleg minder duidelijk ;)

Maar ik zag in je uitleg een "per medewerker" staan, dan zou je van die subselect iets ala:
select max(contractid) from contracten where datum <= 1 augustus
group by medewerkersnummer;

kunnen maken.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Is dit misschien wat je zoekt?

SELECT ContractID, Begindatum
FROM Contract AS C
JOIN (
SELECT MedewerkerID, MAX (Begindatum) AS Begindatum
FROM Contract
WHERE Begindatum <= #08/31/2002#
GROUP BY MedewerkerID
) AS A ON A.MedewerkerID = C.MedewerkerID AND A.Begindatum = C.Begindatum

Never underestimate the power of


  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Probeer de volgende query eens:

SELECT *
FROM Contract
WHERE beginDatum<=#8/31/2002# And Not beginDatum<=#7/31/2002#
ORDER BY [beginDatum];


Die doet het kunstje, volgens mij.
Ik heb de volgende testset gebruikt:

"contractID" "beginDatum" "medewerkerID"
1 29-JUL-2002 0
2 31-JUL-2002 0
3 01-AUG-2002 0
4 01-AUG-2002 0
5 17-AUG-2002 0
6 30-AUG-2002 0
7 02-AUG-2002 0
8 31-AUG-2002 0
9 31-AUG-2002 0
10 01-SEP-2002 0
11 06-SEP-2002 0

En het resultaat:
"contractID" "beginDatum" "medewerkerID"
4 01-AUG-2002 0
3 01-AUG-2002 0
7 02-AUG-2002 0
5 17-AUG-2002 0
6 30-AUG-2002 0
9 31-AUG-2002 0
8 31-AUG-2002 0


Volgens mij wat je wilde hebben, of niet?

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
kasper_vk:

Voorzover ik het begrepen heb, is dit niet de bedoeling. In jouw testset zit maar één medewerker, dus zou er ook één contract in het resultaat moeten zitten.

Of ik heb het helemaal verkeerd begrepen. >:)

Never underestimate the power of


Verwijderd

MIsschien ligt het aan mij, maar is Descending niet geef mij het hoogste?!?! dus 2-8 i.p.v. 1-8?

zou je dan niet bij die union select "ORDER BY Begindatum ASC)" of helemaal ASC/DESC weglaten aangezien ASCending defautl is?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Descending zorgt er inderdaad voor dat de hoogste/grootste bovenaan in het resultaat komt te staan.
En dat is ook de bedoeling, want alleen de nieuwste contracten moeten getoond worden. Probleempje is alleen dat er per medewerker een contract getoond moet worden.

Never underestimate the power of


Verwijderd

dus gewoon per mdw zijn laatste contract?

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
het antwoord staat toch gewoon al gegeven door ACM ?? :? (wel ervanuitgaande dat een contractid oploopt met de tijd en niet cycled)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Volgens mij was de reaktie van ACM inderdaad een hint in de goede richting.

Ik dacht zelf een aardig goede query hier neergezet te hebben, maar daar is helaas nog geen reaktie op gekomen van de topicstarter.

Never underestimate the power of

Pagina: 1