Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:07 Der 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

Hvordan gør jeg?
Avatar billede trumf Nybegynder
16. juni 2004 - 12:16 #1
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.
Avatar billede overchord Nybegynder
16. juni 2004 - 12:17 #2
SELECT TOP 10((COUNT (ordrer.ID)) AS AntalOrdrer, Kunder.Navn FROM KUnder INNER JOIN ordrer ON kunder.telefon = ordrer.telefon GROUP BY ordrer.telefon

- ikke testet, blot et forslag.
Avatar billede trumf Nybegynder
16. juni 2004 - 12:19 #3
Nåh ja, der skulle lige en TOP 10 med, eller LIMIT 10 hvis det er mySQL
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:19 #4
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."

Måske fordi jeg bruger en access database?
Avatar billede trumf Nybegynder
16. juni 2004 - 12:24 #5
prøv lige overchords løsning (med en ORDER BY AntalOrdrer i enden) før jeg lige laver min om
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:26 #6
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.
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:28 #7
Hmm.. Der var en "(" for meget i starten så vidt jeg kan se, men nu får jeg samme fejl som med trumfs løsning..
Avatar billede trumf Nybegynder
16. juni 2004 - 12:29 #8
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
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:35 #9
Desværre samme fejl.. :S
Avatar billede trumf Nybegynder
16. juni 2004 - 12:36 #10
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
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:41 #11
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?
Avatar billede trumf Nybegynder
16. juni 2004 - 12:42 #12
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
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:46 #13
Samme fejl.. :(
Avatar billede trumf Nybegynder
16. juni 2004 - 12:47 #14
prøv så med k.telefon i COUNT fra den sidste
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:51 #15
Stadig intet godt.. :(
Avatar billede trumf Nybegynder
16. juni 2004 - 12:51 #16
Jeg har noget tilsvarende, men der opretter jeg en temporær tabel og arbejder i den. Ved ikke hvordan det gøres i Access
Avatar billede cool_casper Nybegynder
16. juni 2004 - 12:51 #17
Tak for tålmodigheden btw !-)
Avatar billede trumf Nybegynder
16. juni 2004 - 12:53 #18
Avatar billede trumf Nybegynder
16. juni 2004 - 13:05 #19
CREATE TABLE temp SELECT TOP 10 telefon, COUNT(*) AS antalOrdrer FROM ordrer ORDER BY antalOrdrer DESC

SELECT k.navn, t.antalOrdrer FROM temp t, kunder k WHERE t.telefon = k.telefon ORDER by antalOrdrer

...

DROP TABLE temp
Avatar billede cool_casper Nybegynder
16. juni 2004 - 13:06 #20
Jeg prøver....
Avatar billede trumf Nybegynder
16. juni 2004 - 13:29 #21
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
Avatar billede trumf Nybegynder
16. juni 2004 - 13:29 #22
id = telefon :-)
Avatar billede cool_casper Nybegynder
16. juni 2004 - 14:45 #23
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."
Avatar billede cool_casper Nybegynder
16. juni 2004 - 15:08 #24
Det fungerer stadig ikke! :(
Avatar billede overchord Nybegynder
16. juni 2004 - 15:22 #25
Proev at bryde den lidt ned i stumper foerst.

1. Lav AntalOrdrer foerst og check om den virker:
SELECT COUNT(ordrer.telefon) As AntalOrdrer FROM ordrer GROUP BY ordrer.telefon

2. Opret linket til kunde-tabellen, men uden count
SELELCT kunde.navn, ordrer.id FROM kunde INNER JOIN ordrer ON kunde.telefon = ordrer.telefon
Avatar billede eagleeye Praktikant
16. juni 2004 - 18:07 #26
Prøv sådan her:

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"
Avatar billede trumf Nybegynder
16. juni 2004 - 23:08 #27
Nåh endelig kom en af de goe. Det var da også på tide eagleeye :-)
Avatar billede cool_casper Nybegynder
16. juni 2004 - 23:40 #28
hehe :D .. Jeg har først mulighed for at prøve det i morgen tidlig, så jeg vender tilbage så snart jeg ved noget om sagen !-)
Avatar billede cool_casper Nybegynder
17. juni 2004 - 12:39 #29
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
Avatar billede cool_casper Nybegynder
18. juni 2004 - 11:18 #30
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 !-)
Avatar billede trumf Nybegynder
23. juni 2004 - 02:10 #31
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!

Godt du fik det til at virke :-)
Avatar billede cool_casper Nybegynder
23. juni 2004 - 12:59 #32
Du får lidt for det eagleeye !-)
Avatar billede cool_casper Nybegynder
23. juni 2004 - 13:00 #33
Tak!
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
Kurser inden for grundlæggende programmering

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