Goeiendag,

Ik moet voor stage een soort van rapport maken waarbij de gebruiker kan zien welk werknemer binnenkort zijn diploma's vervallen/ongeldig zijn.

laten wij zeggen dat elk medewerker in dit bedrijf 3 diploma's zijn en dus ook 3 soorten medewerkers zijn (a, b, c neem ik als voorbeeld).
Maar het kan dus zo zijn dat een medewerker omgeschoold is naar een ander soort medewerker (van a naar b).
Als een medewerker dus omgeschoold is, staan beide diploma's in de database.

Het zou makelijk op te lossen zijn met een extra kolom om te markeren of een diploma relevant is of niet. Maar helaas is dit niet mogelijk, aangezien de database wordt beheerd door een ander programma die ik niet aan kan passen (lees, geen opensource).

Wat ik dus nu zoek is een manier om alle diploma's van een persoon te weergeven als deze 1 diploma bezit die vervalt. Ik geloof dat dit wel mogelijk is met een inner join, maar ik ben geen SQL expert en heb dit ook nooit geprobeerd. Kan iemand mij een soort van pseudo-code geven hoe ik dit moet aanpakken?

Verder hier het overige informatie:

Elk record ziet het volgende eruit:

 - Pernr: char(6), dit is de afkorting gebruikt om een persoon te herkennen
 - regopm: char(30), de diploma
 - tdat: datetime, de datum wanneer de diploma vervalt
 - vdat: datetime, de datum wanneer de diploma is verkregen


Mijn huidige SQL code
(excuses voor al dat CONVERT gedoe, dit ivm met presenteren van gegevens)

SELECT 
        pernr, 
        regopm, 
        CONVERT(varchar, tdat, 103) AS tdate, 
        CONVERT(varchar, vdat, 103) AS vdate, 
        tdat
FROM 
        medewerkers
WHERE     
        (tdat IS NOT NULL) AND 
        (CONVERT(datetime, CONVERT(varchar, tdat, 103), 103) >=
        CONVERT(datetime, CONVERT(varchar, GETDATE() - 1, 103), 103)) AND
        (CONVERT(datetime, CONVERT(varchar, tdat, 103), 103) <= 
        CONVERT(datetime, CONVERT(varchar, GETDATE() + 365, 103), 103))
ORDER BY 
        YEAR(tdat), MONTH(tdat), DAY(tdat)
Om alle mederwerkers te selecteren die in het bezit zijn van een diploma dat binnen 30 dagen vervalt:

SELECT
	pernr
FROM
	medewerkers
WHERE
	tdat < CURRENT_DATE + INTERVAL 30 DAY

Als je alle diplomas van betreffende werknemer wilt selecteren, zul je dit in een subquery moeten gieten:

SELECT
	pernr,
	regopm
FROM
	medewerkers
WHERE
	pernr IN (
		SELECT
			pernr
		FROM
			medewerkers
		WHERE
			tdat < CURRENT_DATE + INTERVAL 30 DAY
	)

Bedankt,

Ik zal er mee aan de slag.
Even uit puur SQL interesse, hoe zou ik alleen medewerkers kunnen selecteren waar alle diploma's verlopen?

Als ik te lastig ben, zeg het maar. Maar ik vroeg me gewoon wat af.

Maar bedankt in iedergeval, ik zal er mee aan de slag :)
Dat zou de tegengestelde query zijn, dus alle personen selecteren die geen verloopdatum buiten nu en 30 dagen in de toekomst hebben:

SELECT
    pernr,
    regopm
FROM
    medewerkers
WHERE
    pernr NOT IN (
        SELECT
            pernr
        FROM
            medewerkers
        WHERE
            tdat > CURRENT_DATE + INTERVAL 30 DAY
    )
Bijna zo simpel dat ik bijna spijt krijg dat ik niet eerder een google zoekopdracht erop los gelaten had.

Maar bedankt in iedergeval, ik zal er mee bezig.

Reageren