Avatar billede htm Nybegynder
16. september 2003 - 11:24 Der er 11 kommentarer og
1 løsning

Statestik udregnet på dato

Hej

Jeg har en tabel der hedder status, den har bla. følgende felter og data:

nr - status - dato
----------------------
1 - 7 - 14-09-2003
1 - 10 - 14-09-2003
1 - 1 - 16-09-2003
2 - 7 - 14-09-2003
2 - 13 - 15-09-2003
2 - 2 - 17-09-2003

Status er et nummer der repræsenterer statusen, hvor
7 = start
1,2 = afsluttet

Alle andre status er ligegyldig her.

Det jeg ønsker er antal gennemsnitdage der er i mellem statusstart og statusafsluttet.

Det skal udregnes på de nr. der er afsluttet i den valgte måned.

Dato er formateret som vist i eks.

Hvordan ser det ud i en SQL-sætning?
Avatar billede venne Nybegynder
16. september 2003 - 11:46 #1
Jeg går ud fra at det er én samlet gennemsnitsværdi du vil have:

SELECT AVG(CONVERT(float, DATEDIFF(day, start, slut)))
FROM (
SELECT nr, MIN(dato) AS start, MAX(dato) AS slut
FROM status
WHERE status IN (7, 1, 2)
GROUP BY nr
) AS tmp
WHERE MONTH(slut) = 9
Avatar billede htm Nybegynder
16. september 2003 - 11:56 #2
Ser umiddelbart ok ud - skal lige tjekke den igennem.

Men skal denne være sådan:
WHERE status IN (7, 1, 2)
???
Den tager vel både start og afsluttet status i en?

Hvad hvis startdato eks. er 30-03-2003 og slut er 05-04-2003 vil den så ikke give 1 dag for den enkelte?
Avatar billede htm Nybegynder
16. september 2003 - 12:01 #3
Samtidig skal den jo ikke tælles sammen hvis der ikke er en afsluttet dato.

Jeg syntes det ser ud til at WHERE status IN (7, 1, 2) regner sammen selvom der ikke er afsluttet status. bare der er en startdato. Og det har alle nr.
Avatar billede venne Nybegynder
16. september 2003 - 12:01 #4
WHERE-delen er med fordi vi kun interesserer os for netop de statusser.
Samtidig laver vi GROUP BY nr. Dermed kommer der kun én række pr. værdi af nr. I den række tager vi så den første og den sidste dato som hhv. start og slut. Derefter regner vi på de to datoer i den ydre SELECT.
Avatar billede venne Nybegynder
16. september 2003 - 12:04 #5
Nå ja, de behøver ikke at være afsluttet. Momento...
Avatar billede venne Nybegynder
16. september 2003 - 12:07 #6
Jeg har sat en betingelse ind om at der skal være præcis to rækker pr. værdi af nr med status 1, 2 eller 7. Altså enten en række 7 og en række 1 ELLER en række 7 og en række 2.

SELECT AVG(CONVERT(float, DATEDIFF(day, start, slut)))
FROM (
SELECT nr, MIN(dato) AS start, MAX(dato) AS slut
FROM status
WHERE status IN (7, 1, 2)
GROUP BY nr
HAVING COUNT(*) = 2
) AS tmp
WHERE MONTH(slut) = 9
  AND slut IS NOT NULL
Avatar billede venne Nybegynder
16. september 2003 - 12:09 #7
Hov, drop den sidste linie (AND slut IS NOT NULL) - det skulle ikke med.
Avatar billede htm Nybegynder
16. september 2003 - 12:28 #8
Hmm - HAVING COUNT(*) = 2 - sikrer den ikke bare at der minimum skal være 2 status? Eller er det mig der tager fejl?

Der kan godt være en masse mellemliggende status. så antallet af status kan være 1,2 5, 10 osv. uden at den er afsluttet! Der skal tjekkes om der status er 1 eller 2 før den tælles med.
Avatar billede venne Nybegynder
16. september 2003 - 12:43 #9
Den sikrer, sammen med WHERE-delen, at der er præcis to forekomster af status 1, 2 og 7. Hvis der er sådan, at sagen altid startes med status 7 og altid afsluttes med enten status 1 eller status 2, så skulle det virke. Hvis en sag kan have både en status 1 og en status 2, så dur det ikke (men det kan det nok komme til...)
Avatar billede htm Nybegynder
16. september 2003 - 12:53 #10
Ja det har du ret i.

Men jeg har et problem med den. Det ser ud til at den tager 1 mindre end det skal være.

eks. har jeg et resultat der giver 4,78 med din og det skal være 5,78 - Det ser umiddelbart til at det er generelt over hele linien?

Hvad skyldes det?
Avatar billede venne Nybegynder
16. september 2003 - 12:57 #11
Nåja, det er bare en regnefejl. Der skal lægges 1 til DATEDIFF'en:

SELECT AVG(CONVERT(float, DATEDIFF(day, start, slut) + 1))
FROM (
SELECT nr, MIN(dato) AS start, MAX(dato) AS slut
FROM status
WHERE status IN (7, 1, 2)
GROUP BY nr
HAVING COUNT(*) = 2
) AS tmp
WHERE MONTH(slut) = 9


Nu tæller både start- og slutdatoen med i varigheden.
Avatar billede htm Nybegynder
16. september 2003 - 13:00 #12
Så er det bare super - mange tak!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester