Avatar billede beorndesign Nybegynder
03. november 2006 - 09:41 Der er 7 kommentarer og
1 løsning

Select og sammenlign data i samme tabel

Jeg skal have udvalgt de numre(no) fra tabel1, hvor der ikke er en dato med teksten "print", som er nyere end et felt med teksten "faktura", samtidig med at der i tabel2 er data på de samme numre(no).
D.v.s at jeg vil have fundet følgende "no": 1

Tabel1
Dato    | Tekst      | no
----------------------------
010206  | print      |  1
020206  | bla bla    |  1
010206  | faktura    |  1
130306  | print      |  2
130306  | faktura    |  2
140306  | print      |  2
140306  | print      |  3
150306  | print      |  4
160306  | faktura    |  4

Tabel2
no | tekst
-----------
1  | bla
1  | bla bla
2  | bla
Avatar billede lorentsnv Nybegynder
03. november 2006 - 10:03 #1
Det kan være at nedenstående skal justeres lidt. Nedenstående giver dig alle records i Tabel1 som er kommet efter den seneste 'print', hvor der findes en relateret record i Tabel2. Er det hvad du ønsker?

select *
from Tabel1 t1
inner join Tabel2 t2 on t1.no = t2.no
where t1.Dato > (Select Max(Dato) from Tabel1 where Tekst = 'print' and no = t1.no)
Avatar billede beorndesign Nybegynder
03. november 2006 - 12:10 #2
Det virker! Der er blot følgende problem, at hvis dataene ser ud som følgende, får jeg følgende output: 1, 1
Jeg kan ikke lige gennemskue, hvordan det løses. Der er desuden højst en record i tabel 2 med det samme nummer(no).

Tabel1
Dato    | Tekst      | no
----------------------------
010206  | print      |  1
010206  | faktura    |  1
020206  | print      |  1
030203  | faktura    |  1
130306  | print      |  2
130306  | faktura    |  2
140306  | print      |  2

Tabel2
no | tekst
-----------
1  | bla
2  | bla bla
Avatar billede lorentsnv Nybegynder
03. november 2006 - 12:38 #3
Hvad med denne:

select t1.*
from Tabel1 t1
inner join Tabel2 t2 on t1.no = t2.no
where t1.Dato > (Select Max(Dato) from Tabel1 where Tekst = 'print' and no = t1.no)
Avatar billede beorndesign Nybegynder
03. november 2006 - 13:11 #4
Nop, det virker ikke!
Avatar billede lorentsnv Nybegynder
03. november 2006 - 13:29 #5
Så er jeg ikke helst sikker på jeg forstår hvad du mener.
Jeg forsøgte at oprætte dine tabeller, og kørte sql'en, og fik det svar jeg havde forventet.
Kan du forklare lidt mere detaljeret hvad der ikke passer?
Avatar billede beorndesign Nybegynder
03. november 2006 - 14:00 #6
Det er mig der ikke har forklaret det korrekt. Nogle af dataene ser ud som følgende, hvilket betyder at jeg får begge records med * frem i min søgning. Jeg har kun brug for den nyeste :-)

Tabel1
Dato dmå | Tekst      | no
----------------------------
010206  | print      |  1
010206  | faktura    |  1
020206  | print      |  1
030206  | faktura    |  1 *
040206  | faktura    |  1 *
Avatar billede lorentsnv Nybegynder
03. november 2006 - 14:31 #7
Følgende skulle fungere:

Select t1.*
From Tabel1 t1
inner join (select [No], max(Dato) NyesteDato from Tabel1 group by No) tt1
    on t1.No = tt1.No and t1.Dato = tt1.NyesteDato
inner join Tabel2 t2 on t1.no = t2.no
where t1.Dato > (Select Max(Dato) from Tabel1 where Tekst = 'print' and no = t1.no)

alternativt kan du bytte di where med:

where t1.Tekst <> 'print'

Den sidste kan du benytte, hvis du bruger klokkeslet på din Dato, således at Dato altid vil være unikt indenfor hvert no. I dit første eksempel har du en print og en faktura den 13.3. Hvis disse ikke kan skilles fra hinanden, skal du bruge den første Where. Hvis du har et klokkeslet på datoen, således at det er mulig at se hvilken som kom først af print og faktura den 13.3.06 på no 2, vil den sidste where være mest effektiv.

Hvis du kan have to linier med anden tekst end print på samme dato på et enkelt no, og disse ikke kan skilles fra hinanden på tid, vil ovenstående sql skulle modificeres lidt mere, da den ikke checker om der er f.eks. to fakturalinier på identisk dato på samme no. I så fald, vil du få to liner på et no.
Avatar billede beorndesign Nybegynder
03. november 2006 - 15:28 #8
Det virker, det er jo super :-) Tusind tak og her er velfortjente point.
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