Avatar billede royal12 Nybegynder
12. juni 2003 - 12:11 Der er 8 kommentarer og
1 løsning

SQL sætning

Hejsa

Jeg har en table som ser sådan ud:

id    ord    antal    side_id
1    bil    2    12221
2    park    3    12221
3    bil    1    12222
4    bil    3    12223
5    park    4    12223   

og har fået lavet mig følgene sql sætning:

Select side_id, sum(antal) as antal from test where ord in ('bil','park') group by side_id

som giver følgene resultat:

side_id        antal
12221        5
12222        1
12223        7

mit problem er at jeg kun vil have udskrevet de side_id´er som indeholder både "bil" og "park"
altså:

side_id        antal
12221        5
12223        7

Hvordan går jeg det??

Mvh
Royal

PS. det spørgsmål her været oprettet før men jeg kom til at godkende et svar der afligevel ikke var godt nok.
se evt. http://www.eksperten.dk/spm/363805
Avatar billede techhouse Nybegynder
12. juni 2003 - 13:48 #1
Hvad med...
Select x.side_id, sum(x.antal) as antal from (select * from test where side_id in (select side_id from test where ord ='bil') and side_id in (select side_id from test where ord = 'park')) x group by x.side_id
/Thomas
Avatar billede janus_007 Nybegynder
12. juni 2003 - 14:27 #2
techhouse-> hmm lader til at der så skal oprettes en select for hvert ord !

royal12 - > Kunne du ikke flette en trailer med ind mere og evt. komme med lidt kriterier, ønsket output på det så ??
Avatar billede royal12 Nybegynder
12. juni 2003 - 14:28 #3
hmmm...virker næsten.
men den summere alle antal inden for et bestemt side_id f.eks giver:

Select x.side_id, sum(x.antal) as antal from (select * from test where side_id in (select side_id from test where ord ='bil')) x group by x.side_id

12221    5
12222    1
12223    7

Hvor den skulle give:

12221    2
12222    1
12223    3
Avatar billede royal12 Nybegynder
12. juni 2003 - 14:44 #4
jo. hvis vi nu har følgene table:
id    ord    antal    side_id
1    bil    2    12221
2    park    3    12221
3    bil    1    12222
4    bil    3    12223
5    park    4    12223
6    trailer 3    12221
7    trailer 2    12224

Hvis man så søger på "bil","park","trailer" skal outputet være:

12221  8

søger man på "trailer" skal outputet være:

12221  3
12224  2

Håber det hjælper lidt.
Avatar billede jesperfj Nybegynder
12. juni 2003 - 14:50 #5
Med 2 ord kan det gøres således:
SELECT t1.side_id, t1.antal + t2.antal AS antal
FROM test AS t1, test AS t2
WHERE t1.side_id = t2.side_id
AND t1.ord = 'bil' AND t2.ord = 'park'
ORDER BY t1.side_id

Det andet eksempel kan rettes til med *AND ord in ('bil)*:
Select x.side_id, sum(x.antal) as antal from (select * from test where side_id in (select side_id from test where ord ='bil') AND ord in ('bil))) x group by x.side_id
Avatar billede janus_007 Nybegynder
12. juni 2003 - 15:01 #6
Der er ikke den store forskel imellem de 2... begge laver flere unødige selects og begge også opbygges dynamisk!

Det skulle vel helst ende op med en løsning hvor man blot havde 1 eller 2 input parametere *S* - eller hvad ?
Avatar billede janus_007 Nybegynder
12. juni 2003 - 15:12 #7
Kunne man måske gøre sådan her :

select sum(antal), side_id from Table1 where side_id in(select side_id from Table1
where ord in('trailer', 'bil', 'park')
group by side_id
having count(*) > 2)
and ord in('trailer', 'bil', 'park')
group by side_id

Og hvor så selve having count er lig med antallet af kommaer i in-clausen, i ovenstående tilfælde altså 2 og ved søgning kun på 'trailer' altså 0
Avatar billede janus_007 Nybegynder
18. juni 2003 - 10:03 #8
royal-> Har du fået det til at funke ?
Avatar billede royal12 Nybegynder
18. juni 2003 - 10:38 #9
Ja, tak for hjælpen. Jeg havde helt glemt at Accepter. Min fejl :-(
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

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