Avatar billede jademutter Nybegynder
30. april 2007 - 11:25 Der er 7 kommentarer og
1 løsning

Flere counts?

Hej...

Jeg troede lige jeg havde den, men jeg er åbenbart dummere end jeg selv havde forventet...

I forlængelse af http://www.eksperten.dk/spm/775476, vil jeg også gerne have forretningens faciliteter med, således at jeg kan vælge de forretninger, der sælger biler og lastbiler, men samtidigt også har både værksted og salg.

Jeg prøvede at genbruge den kode som "bauerdata" var så flink at hjælpe mig med, men det virker ikke...

Hvordan får jeg lavet en SQL-forespørgsel der henter de forretninger der sælger lastbiler og biler, og som samtidigt har både salg og værksted?

/Jademutter
Avatar billede barklund Nybegynder
30. april 2007 - 11:40 #1
Kom med dit forsøg :)
Avatar billede jademutter Nybegynder
30. april 2007 - 12:54 #2
Mit forsøg:

select fornr, products.count(*) as proantal, facility.count(*) as facantal
from products, facility
where products.product in ('biler', 'lastbiler')
and  facility.facility in ('salg','værksted')
group by fornr
having proantal = 2 and having facantal = 2

/Jademutter
Avatar billede barklund Nybegynder
30. april 2007 - 13:10 #3
Det ser rimeligt crazy ud :)

Prøv at komme med nogle dataeksempler og hvordan resultatet heraf skulle se ud - så er det nok lidt nemmere at forstå :)
Avatar billede kjulius Novice
01. maj 2007 - 00:37 #4
Hvad med noget lignende dette?

SELECT s.fornr, s.navn, s.adresse, s.by, s.indehaver
FROM shops s
INNER JOIN products p ON s.fornr = p.fornr
INNER JOIN facilities f ON s.fornr = f.fornr
WHERE p.product IN ('biler', 'lastbiler')
  AND f.facility IN ('salg', 'værksted')
GROUP BY s.fornr
HAVING COUNT(DISTINCT p.product) = 2 AND COUNT(DISTINCT f.facility) = 2
Avatar billede kjulius Novice
01. maj 2007 - 00:42 #5
Hmm... Selv om MySQL sikkert kan køre min SQL, så overholder den ikke standard SQL, så vi må hellere tilføje de andre felter på GROUP BY, så du evt. senere kan bruge den samme SQL på andre databaser:

SELECT s.fornr, s.navn, s.adresse, s.by, s.indehaver
FROM shops s
INNER JOIN products p ON s.fornr = p.fornr
INNER JOIN facilities f ON s.fornr = f.fornr
WHERE p.product IN ('biler', 'lastbiler')
  AND f.facility IN ('salg', 'værksted')
GROUP BY s.fornr, s.navn, s.adresse, s.by, s.indehaver
HAVING COUNT(DISTINCT p.product) = 2 AND COUNT(DISTINCT f.facility) = 2

Det var en lille svipser, sorry. :-(
Avatar billede kjulius Novice
01. maj 2007 - 01:02 #6
En anden måde at opnå samme resultat kunne være at referere til den samme tabel flere gange (man skal så give den forskellige alias):

SELECT s.fornr, s.navn, s.adresse, s.by, s.indehaver
FROM shops s
INNER JOIN products p1 ON s.fornr = p1.fornr AND p1.product = 'biler'
INNER JOIN products p1 ON s.fornr = p2.fornr AND p2.product = 'lastbiler'
INNER JOIN facilities f1 ON s.fornr = f1.fornr AND f1.facility = 'salg'
INNER JOIN facilities f2 ON s.fornr = f2.fornr AND f2.facility = 'værksted'

På sin vis er det mere "clean" og også mere fleksibelt at gøre det på den måde i stedet for med grouping og count.
Avatar billede jademutter Nybegynder
01. maj 2007 - 18:30 #7
Tak kjulius.... det virker nøjagtigt som planlagt....

/Jademutter
Avatar billede kjulius Novice
01. maj 2007 - 18:54 #8
Fint... :-)
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