Avatar billede htm Nybegynder
10. februar 2005 - 10:07 Der er 7 kommentarer og
1 løsning

Avanceret SQL

Hej

Jeg skal have hentet alle ordrer der er leveret inden for 2 måneder ud af min database. Men kan ikke lige gennemskue hvordan.

Min database er som følger:

Ordrearkiv
-------------------
Nummer  (varchar(10))
Konto    (varchar(10))
ordre    (varchar(10))

Ordreliniearkiv
-------------------
Nummer  (varchar(10))
levering (datetime)

Jeg vil godt have nummer og ordre ud fra ordrearkiv og levering ud fra ordreliniearkiv hvor konto = '  12345678'

- Tabellerne er kædet sammen med Nummer
- Der kan være 1 eller mange rækker i ordreliniearkiv som passer til ordrearkiv
- Der skal tjekkes på om den nyeste linie der matcher et ordrenummer er mindre end 2 måneder siden.


Håber det er til at forstå.

et lille eks på en ordre kunne være:

ordrearkiv
-------------------
'    123456', '  12345678', 'ny ordre'
'    123457', '  12345678', 'ny ordre'


ordreliniearkiv
-------------------
'    123456','10-10-2004 10:23:33'
'    123456','10-10-2004 10:23:33'
'    123456','10-12-2004 10:23:33'
'    123456','29-10-2004 10:23:33'
'    123456','02-02-2005 10:23:33'
'    123457','10-10-2004 10:23:33'
'    123457','10-10-2004 10:23:33'

I ovenstående eksempel skal den altså outputte, hvor 123456 skal med ud og 123457 ikke skal med ud.

'    123456', 'ny ordre', '02-02-2005 10:23:33'

Hvordan gør jeg det? Helst i en enkelt Select sætning, eller en enkelt stored procedure.

Spørg endelig hvis der er noget I ikke forstår
Avatar billede lorentsnv Nybegynder
10. februar 2005 - 12:31 #1
Select distinct o.nummer, o.ordre, l.levering
From ordrearkiv o left join ordreliniearkiv l on o.nummer = l.nummer
where l.levering >= dateadd(m,2,getdate())
Avatar billede lorentsnv Nybegynder
10. februar 2005 - 12:36 #2
Unskyld, det skal være -2 i dateadd funktionen:

Select distinct o.nummer, o.ordre, l.levering
From ordrearkiv o left join ordreliniearkiv l on o.nummer = l.nummer
where l.levering >= dateadd(m,2,getdate())
Avatar billede lorentsnv Nybegynder
10. februar 2005 - 12:36 #3
Prøver igen:

Select distinct o.nummer, o.ordre, l.levering
From ordrearkiv o left join ordreliniearkiv l on o.nummer = l.nummer
where l.levering >= dateadd(m,-2,getdate())
Avatar billede lorentsnv Nybegynder
10. februar 2005 - 12:39 #4
Ovenstående sql vil give dig flere linier på et ordrenummer, hvis leveringsdato er forskellig inden for en ordre. Er det det du ønsker?

Du vil eventuelt kunne få:

'    123456', 'ny ordre', '02-02-2005 10:23:33'
'    123456', 'ny ordre', '02-03-2005 10:23:33'
Avatar billede htm Nybegynder
10. februar 2005 - 12:46 #5
Det jeg ønsker er 1 linie for hvert ordrenummer med den nyeste levering påhæftet.

Sådan at jeg udfra mit eksempel kun får den ene linie i mit resultat.

Derfor vil dit give mig for mange rækker.
Avatar billede lorentsnv Nybegynder
10. februar 2005 - 12:50 #6
Men hvilken leveringsdato ønsker du, dersom der er flere leveringsdato på en ordre?

I nedenstående tilfælde vil du få den seneste leveringsdato på ordren:

Select distinct o.nummer, o.ordre, max(l.levering)
From ordrearkiv o left join ordreliniearkiv l on o.nummer = l.nummer
where l.levering >= dateadd(m,-2,getdate())
group by o.nummer, o.ordre
Avatar billede lorentsnv Nybegynder
10. februar 2005 - 12:51 #7
Jeg var igen lidt hurtig, du behøver ikke distinct i dette tilfælde:

Select o.nummer, o.ordre, max(l.levering)
From ordrearkiv o left join ordreliniearkiv l on o.nummer = l.nummer
where l.levering >= dateadd(m,-2,getdate())
group by o.nummer, o.ordre
Avatar billede htm Nybegynder
10. februar 2005 - 13:03 #8
Det var det jeg ville :-) (med enkelte modifikationer)

Jeg gjorde det meget mere kompliceret end det egentlig var.
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