Et CPRNR plejer at identificere en person entydigt. Det du siger er, at hvis samme person arbejder på flere apoteker samtidig eller i flere stillinger på samme apotek, så skal det ikke registreres, hvis han/hun har være fraværende i 4 dage i forskellige stillinger.
Det er det, du siger, men jeg tror ikke, det er det, du mener, vel? M.a.o. jeg tror at
STILLINGSKODEID og APOTEKNR er irrelevante i søgningen?
Derefter er der to forskellige problemer, du vil have løst:
1. Bestemme hvile *arbejdsdage* der er i træk.
2. Sammentælle timer, når der er 'S' i fire arbejdsdage i træk.
Det er ikke enkelt at finde ud af, hvad en "arbejdsdag" er. Du skriver bare "dage", men du ønsker måske at fraregne søn- og helligdage? Er lørdage arbejdsdage? Hvad med vagtapoteker med døgn- og helligdagsåbent?
Det er ikke enkelt, at få SQL til at hente rækker "i træk".
Der er to mulige løsninger:
A) Skriv et program, og brug kun SQL til at hente de rå data. By logikken om arbejdsdage og "i træk" ind i programmet. Du kan bruge ethvert programmeringssprog med fornuftige databasebindinger (VB, Java, C++) - eller du kan bruge stored procedures som er medfødte i dit database produkt (Oracle, SQLServer, DB2, ...).
B) Antag at arbejdsdagene er de samme for alle (ingen vagtapoteker). Antag, at samme person højst registreres een gang pr. dato. Så kan det løses således:
Opret en tabel kaldet ARBEJDSDAGE med to felter - Nummer og Dato. Du må indtaste og vedligeholde tabellen manuelt. Enhver arbejdsdag, som kan forekomme i WEB_FRAVAERS_OPLYSNING, skal være registreret i ARBEJDSDAGE. Hvis en Dato i ARBEJDSDAGE tabellen har Nummer x, så skal den foregående arbejdsdag have nummer x-1 (helt tilbage til starten af systemet). Bemærk, at Nummer skal vokse for evigt - du må ikke starte forfra ved nytår.
Nu kan du så joine OPRET_DATO i WEB_FRAVAERS_OPLYSNING med Dato i ARBEJDSDAGE og bruge det til at finde arbejdsdagens Nummer for hver række i WEB_FRAVAERS_OPLYSNING.
De rækker, som er relevante, er de, hvor antallet af fravær, count(*), mellen Nummer og Nummer - 3 er >= 4. Hvis der er 5 fraværsdage, skal du lige passe på, for du får to rækker i svaret - både den med 4 og den med 5. Så du må bagefter fjerne de rækker, hvor Nummer+1 også er med i svaret.
Det var løsningen, så skal du "bare lige" selv formulere det i SQL.
Det hele bliver nok lidt mere overskueligt, hvis du definerer nogle views til at hjælpe med at strukturere opgaven.
Peter