/ Forside/ Teknologi / Udvikling / SQL / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Betingelse
Fra : MKC
Vist : 656 gange
220 point
Dato : 23-06-03 15:45

Hej Peter og andre
Jeg har rettet mit sjusk, og fjernet det kode der ikke har noget med mit problem af gøre.
Mit nuværende problem er:

Hvis attributten FRAVAERSKODEID får værdien 'S' 4 dage i træk,hvilket betyder at man har været syg skal jeg lave sum på timer eller sagt på en anden, måde jeg vil frasortere sygetimer der ikke falder på 4 dage i træk. Det er i linie 9 betingelsen skal skal være i den den vedlagte kode

1 SELECT DISTINCT CPRNR,STILLINGSKODEID,APOTEKNR,OPRET_DATO,

2 (SELECT SUM(ANTAL_TIMER)
3 FROM WEB_FRAVAERS_OPLYSNING WS
4 WHERE     WS.APOTEKNR = W.APOTEKNR
5 AND WS.CPRNR = W.CPRNR
6 AND WS.STILLINGSKODEID = W.STILLINGSKODEID
7 AND WS.OPRET_DATO = W.OPRET_DATO
8   -- NEDENSTÅENDE ER PROBLEMET
9 AND(select count(FRAVAERSKODEID) from WEB_FRAVAERS_OPLYSNING a2
10 where a2.CPRNR = WS.CPRNR and a2.OPRET_DATO = WS.OPRET_DATO and WS.FRAVAERSKODEID= 'S') >= 4   


FROM WEB_FRAVAERS_OPLYSNING W
WHERE
MONTH(DATO) =
(SELECT MAANED FROM PERIODE_INFORMATION WHERE DATO=

(SELECT MAX(DATO) FROM PERIODE_INFORMATION WHERE
AAR IS NOT NULL
AND MAANED IS NOT NULL
AND DATO<
(SELECT MAX(DATO) FROM PERIODE_INFORMATION
WHERE DATO <= CURRENT_TIMESTAMP
AND AAR IS NOT NULL
AND MAANED IS NOT NULL)
))

AND YEAR(DATO) =
(SELECT AAR FROM PERIODE_INFORMATION WHERE DATO=

(SELECT MAX(DATO) FROM PERIODE_INFORMATION WHERE
AAR IS NOT NULL
AND MAANED IS NOT NULL
AND DATO<
(SELECT MAX(DATO) FROM PERIODE_INFORMATION
WHERE DATO <= CURRENT_TIMESTAMP
AND AAR IS NOT NULL
AND MAANED IS NOT NULL)
))

AND NOT EXISTS
(SELECT 1 FROM WEB_FRAVAERS_OPLYSNING W2
WHERE

MONTH(DATO) =
(SELECT MAANED FROM PERIODE_INFORMATION WHERE DATO=

(SELECT MAX(DATO) FROM PERIODE_INFORMATION WHERE
AAR IS NOT NULL
AND MAANED IS NOT NULL
AND DATO<
(SELECT MAX(DATO) FROM PERIODE_INFORMATION
WHERE DATO <= CURRENT_TIMESTAMP
AND AAR IS NOT NULL
AND MAANED IS NOT NULL)
))

AND YEAR(DATO) =
(SELECT AAR FROM PERIODE_INFORMATION WHERE DATO=

(SELECT MAX(DATO) FROM PERIODE_INFORMATION WHERE
AAR IS NOT NULL
AND MAANED IS NOT NULL
AND DATO<
(SELECT MAX(DATO) FROM PERIODE_INFORMATION
WHERE DATO <= CURRENT_TIMESTAMP
AND AAR IS NOT NULL
AND MAANED IS NOT NULL)
))

AND W2.APOTEKNR=W.APOTEKNR
AND W2.STILLINGSKODEID=W.STILLINGSKODEID
AND W2.CPRNR=W.CPRNR
AND W2.OPRET_DATO>W.OPRET_DATO)

ORDER BY CPRNR, STILLINGSKODEID

 
 
Kommentar
Fra : pmbruun


Dato : 23-06-03 16:03

Ku' du ikke vise en lille tabel med 6 rækker - 4 der skal med og 2 der ikke skal, og så vise, hvordan du gerne vil have, at resultatet skal ende med at se ud?

Hvad er alt det der med max(dato) til for?

Peter

Kommentar
Fra : JensT


Dato : 24-06-03 05:11

Og så er der noget med Søndage (vagt) eller ej søndage og helligdage...
Umiddelbart vil jeg sige at det hele bliver meget enklere hvis du udvider tabellen og registreringsproceduren til at indeholde input af nyt felt "samlede sygedage i sygdomsperioden"

mvh
Jens

Kommentar
Fra : MKC


Dato : 24-06-03 08:52

Hej
Her kommer en tabel:

WEB_FRAVAERS_OPLYSNING
|APOTEKNR|CPRNR|STILLINGSKODEID|OPRET_DATO |FRAVAERSKODEID|ANTAL_TIMER|
|-------------------------------------------------------------------|-------------|
| 1 | 2 | 20 | 23-06-2003 | S | 8 |
|---------------------------------------------------------------------------------|
| 1 | 2 | 20 | 24-06-2003 | S | 8 |
|---------------------------------------------------------------------------------|
| 1 | 2 | 20 | 25-06-2003 | S | 8 |
|---------------------------------------------------------------------------------|
| 1 | 2 | 20 | 26-06-2003 | S | 8 |
|---------------------------------------------------------------------------------|
| 2 | 3 | 20 | 23-06-2003 | F | 3 |
|---------------------------------------------------------------------------------|
| 2 | 3 | 20 | 23-06-2003 | S | 2 |
|------------------------------------------------------------------------------ --|
| 2 | 3 | 20 | 23-06-2003 | S | 4 |
----------------------------------------------------------------------------------|
| 2 | 3 | 20 | 23-06-2003 | S | 4 |
----------------------------------------------------------------------------------|

Resultatet skal være sum(antal_timer) = 32 fordi det er kun de 4 første rækker der har et 'S' i FRAVAERSKODEID 4 dage i træk for samme STILLINGSKODEID, APOTEKNR samt CPRNR.

Alt det der med max(dato) er høre til noget kode jeg ikke har kopieret ind så det skal du ikke tænke på Sorry

Tak igen
Mikkel

Accepteret svar
Fra : pmbruun

Modtaget 220 point
Dato : 24-06-03 09:46

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


Godkendelse af svar
Fra : MKC


Dato : 24-06-03 09:57

Tak for svaret pmbruun.
jeg går igang nu...               

Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste