Avatar billede KESDA Nybegynder
28. marts 2012 - 11:08 Der er 7 kommentarer og
1 løsning

Hjælp til top 1 og subquery

Hej derude.
Jeg har brug for hjælp til et query. Forestiller mig der skal bruges en subquery men jeg er ikke dygtig nok.
Anvender MSSQL 2005.

Jeg har 2 tabeller - en med kontorer og en med eftersyn. Relationen er kontorid. Der kan være 0 til mange eftersyn pr. kontor.
Det jeg gerne vil have ud, er en liste med alle kontorer hvor der er en kolonne med seneste eftersyn date og en kolonne med resultatet (et tal) fra dette eftersyn. Resultat finde i eftersyn tabellen.
Mit query ser foreløbig således ud:

Select k.kontor, k.beskrivelse, (Select top 1 dato from eftersyn e where (e.kontorid = k.kontorid) as dato
from kontor k

Den fungere perfekt som jeg vil - blot mangler jeg at få resultatet med ud i tabellen.

Er der lige en ekspert der kan hjælpe???
På forhånd tak.
Avatar billede Slettet bruger
28. marts 2012 - 11:53 #1
Select k.kontor, k.beskrivelse, e.Dato, e.Resultat
from kontor k
right outer join eftersyn e
on e.kontorid = k.kontorid
Avatar billede Slettet bruger
28. marts 2012 - 11:55 #2
Hov mangelde Top 1:

Select k.kontor, k.beskrivelse, e.Dato, e.Resultat
from kontor k
right outer join
(select top 1 dato, resultat from eftersyn) e
on e.kontorid = k.kontorid
Avatar billede Slettet bruger
28. marts 2012 - 11:56 #3
... også lige en sidste gang:

Select k.kontor, k.beskrivelse, e.Dato, e.Resultat
from kontor k
right outer join
(select top 1 dato, resultat, kontorid from eftersyn) e
on e.kontorid = k.kontorid
Avatar billede Slettet bruger
28. marts 2012 - 11:57 #4
... GLEM OVENSTÅENDE - DUR IKKE!
Avatar billede KESDA Nybegynder
28. marts 2012 - 12:05 #5
Hej rahp

Gid det var så enkelt.
Jeg har 13 kontorer og foreløbig 7 tilsyn.
Din query giver alle kontorstederne 7 gange med hver sin dato og resultat.
Jeg skulle gerne have største (seneste) eftersynsdato for de enkelte kontorer hvid der findes et eftersyn.
Avatar billede Slettet bruger
28. marts 2012 - 13:42 #6
Denne virker hvis du kun har ét (eller ingen) eftersyn pr. kontorid pr. dato:


select s1.*, e.Resultat
from
(
Select k.kontor, k.beskrivelse, k.kontorid
,(Select max(dato) from eftersyn e
where e.kontorid = k.kontorid) MaxDato
from kontor k
) s1
right outer join eftersyn e
on e.kontorid = s1.kontorid
and e.Dato = s1.MaxDato
Avatar billede runj Nybegynder
28. marts 2012 - 13:44 #7
Select k.kontor, k.beskrivelse, (Select top 1 dato, resultat from eftersyn e where (e.kontorid = k.kontorid) as dato from kontor k
Avatar billede KESDA Nybegynder
28. marts 2012 - 15:13 #8
Hej rahp

Det virker perfekt nu. Min query jeg havde lagt udvar lidt simplificeret, men nu kører det bare.

Tak - så slap jeg alligevel for flere grå håd denne gang. Lægger du  et svar?
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