16. juni 2004 - 12:07Der er
31 kommentarer og 2 løsninger
COUNT og JOIN
Hej,
Hvordan kan jeg lave en top-ti liste sorteret efter antal poster i en anden tabel?
Resume af tabeller: - kunder id, navn, telefon
- ordrer id, pris, telefon
De to telefon-felter er relateret.
Jeg vil gerne lave en top-ti liste over mine mest aktive kunder. Dem med fleste poster i ordrer-tabellen. Jeg har prøvet at joine og counte på forskellige måder, men kan ikke komme frem til det ønskede resultat..:
SELECT k.navn, (SELECT COUNT(*) FROM ordrer WHERE ordrer.telefon=k.telefon) AS mycount FROM kunder AS k INNER JOIN ordrer AS o ON k.telefon = o.telefon
SELECT k.navn, COUNT(k.id) AS antalOrdrer, SUM(o.pris) AS samletKoeb FROM kunder k, ordrer o WHERE o.telefon = k.telefon GROUP BY k.id ORDER BY antalOrdrer DESC
Denne skulle vist give det og så får du også det samlede køb med.
trumf >> "Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'navn' as part of an aggregate function."
Jeg får følgende fejl med overchords query: Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.
Prøv lige uden sum SELECT k.navn, COUNT(k.id) AS antalOrdrer FROM kunder k, ordrer o WHERE o.telefon = k.telefon GROUP BY k.id ORDER BY antalOrdrer DESC
Prøv denne i stedet... SELECT k.navn, COUNT(k.id) AS antalOrdrer, SUM(o.pris) AS samletKoeb FROM kunder k, ordrer o WHERE o.telefon = k.telefon GROUP BY k.telefon ORDER BY antalOrdrer DESC
Samme fejl. Det var dog irriterende.. Jeg har prøvet lidt og fundet ud af at så snart jeg sætter en GROUP eller ORDER BY på så fejler den. Nogle ideer hvorfor?
SELECT TOP 10 k.navn, COUNT(o.telefon) AS antalOrdrer FROM kunder k, ordrer o WHERE o.telefon = k.telefon GROUP BY antalOrdrer ORDER BY antalOrdrer DESC
Hvis det ikke virker, så må du (efter min viden) gøre det på den "hårde" måde
SELECT TOP 10 telefon, COUNT(*) AS antalOrdrer FROM ordrer ORDER BY antalOrdrer DESC ... Do While.. SELECT navn FROM kunder WHERE id = " & hent("id") ... Loop
hmm.. yeah, det kan jeg jo så blive nød til.. Det er bare så langsomt at kalde mange gange! :S
"Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'telefon' as part of an aggregate function."
SQL = "select top 10 count(ordrer.telefon) as antal, kunder.navn from ordrer left join kunder on ordrer.telefon = kunder.telefon order by count(ordrer.telefon) desc"
Det giver desværre stadig fejl! :S Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'navn' as part of an aggregate function.
Kan det være noget opsætning på serveren eller noget i databasen der gør det? En af felterne der har en forkert property eller sådan..? Synes det er meget mærkeligt det ikke virker! :S
Så fik jeg det til at virke. Efter en lang nats arbejde og læsning af div. fora på nettet fandt jeg ud af at jeg skulle groupe med alle de felter jeg vil have ud. Ved ikke hvorfor, men det virker ihvertfald nu. Så må jeg læse lidt mere på det senere.. :) Så nu bruger jeg: select top 10 count(ordrer.telefon) as antal, kunder.navn from ordrer left join kunder on ordrer.telefon = kunder.telefon group by kunder.navn order by count(ordrer.telefon) desc
trumf >> Lidt point som tak for insatsen hvis du smider et svar !-)
eagleeye >> Lidt point fordi jeg kom frem til min løsning ud fra dit svar !-)
Giv dem bare til eagleeye, han har trods alt en status at opretholde og der er alligevel ingen der svarer på mine spm herinde, så jeg har ikke noget at bruge point til!
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.