Avatar billede rane Nybegynder
28. juni 2006 - 14:49 Der er 13 kommentarer og
1 løsning

Group by Top 10

Jeg har nedenstående SQL, som fint grupperer mit indhold:

SELECT DISTINCT bilmodel,biltype,bilmaerke,motor, count(bilmodel) as antal FROM items WHERE (bilmaerke LIKE '%tekst%' OR bilmodel LIKE '%tekst%' OR motor LIKE '%tekst%' OR hk LIKE '%tekst%') GROUP BY bilmodel, biltype,bilmaerke,motor ORDER BY biltype DESC

Der får jeg fint noget a la nedenstående frem:

Personbiler
- Audi A4
- Audi A6
- Mercedes A160
osv.

Lastbiler
- Mercedes Atego
- Mercedes Axor
osv.

Men hvordan sætter jeg en Top 10 på hver af disse 2 kategorier (BilType).  Hvis jeg bare sætter en DISTINCT Top 10 biltype, så tager den kun de første 10 af alle biltyper.  Jeg skal have Top 10 af hver af biltyperne....tricky?
Avatar billede madeindk Nybegynder
28. juni 2006 - 14:52 #1
Hej Rane! Du kan evt. prøve med dette - har aldrig arbejdet med group by så jeg er bestemt ikke sikker.

SELECT TOP 10 * DISTINCT bilmodel,biltype,bilmaerke,motor, count(bilmodel) as antal FROM items WHERE (bilmaerke LIKE '%tekst%' OR bilmodel LIKE '%tekst%' OR motor LIKE '%tekst%' OR hk LIKE '%tekst%') GROUP BY bilmodel, biltype,bilmaerke,motor ORDER BY biltype DESC
Avatar billede rane Nybegynder
28. juni 2006 - 14:54 #2
Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'DISTINCT'.

Har prøvet det samme før + at sætte TOP 10 efter DISTINCT. Sidstnævnte giver selvsagt kun de første 10 hits uafhængig af biltypen.
Avatar billede madeindk Nybegynder
28. juni 2006 - 14:56 #3
SELECT DISTINCT bilmodel,biltype,bilmaerke,motor, count(bilmodel) as antal FROM items WHERE (bilmaerke LIKE '%tekst%' OR bilmodel LIKE '%tekst%' OR motor LIKE '%tekst%' OR hk LIKE '%tekst%') GROUP BY bilmodel, biltype,bilmaerke,motor LIMIT 10 ORDER BY biltype DESC
Avatar billede rane Nybegynder
28. juni 2006 - 15:04 #4
Bruger MS SQL database og ikke MySQL :/
Avatar billede madeindk Nybegynder
28. juni 2006 - 15:06 #5
Argh ok - troede det fungerede på samme måde. Har du prøvet at fjerne stjernen efter TOP 10? Altså sådan her...

SELECT TOP 10 DISTINCT bilmodel,biltype,bilmaerke,motor, count(bilmodel) as antal FROM items WHERE (bilmaerke LIKE '%tekst%' OR bilmodel LIKE '%tekst%' OR motor LIKE '%tekst%' OR hk LIKE '%tekst%') GROUP BY bilmodel, biltype,bilmaerke,motor ORDER BY biltype DESC
Avatar billede rane Nybegynder
28. juni 2006 - 15:08 #6
Jep, samme fejl som tidligere. Kan det mon løses vha. noget paging halløj?  Kan det vel næsten ikke...for jeg skal jo stadig bruge top 10 personbiler og top 10 lastbiler.
Avatar billede madeindk Nybegynder
28. juni 2006 - 15:11 #7
Ok - tror måske jeg har en løsning.

Kan du ikke sætte den til at ligge antal poster sammen i gennem dit loop - går udfra du looper søgeresultatet eller udtrækket fra databasen - altså: count = count + 1

Og så når count når 10 så skal den stoppe med at loope?
Avatar billede rane Nybegynder
28. juni 2006 - 15:13 #8
Nej, vi kører rundt i samme rille. Den count den finder, er jo et samlet count uafhængig af om det er personbil eller lastbil.
Avatar billede madeindk Nybegynder
28. juni 2006 - 15:15 #9
Du kan ikke lave en:

if biltype = "lastbil" then
countLastbil = countLastbil + 1
else
countPersonbil = countPersonbil + 1
end if
Avatar billede rane Nybegynder
28. juni 2006 - 15:22 #10
Så er vi vist ude i en meget besværlig løsning der heller ikke er hurtig/stabil ift. hvis SQL-sætningen blev lavet korrekt?
Avatar billede madeindk Nybegynder
28. juni 2006 - 15:27 #11
Ja, det er korrekt. Men det er en måde at løse det på måske - jeg ved det ikke. Kender ikke så meget til MS SQL Server - desværre.

Jeg må nok trække mig herfra nu.
Avatar billede nielle Nybegynder
29. juni 2006 - 00:04 #12
En mulighed kunne være at bruge UNION:

SELECT TOP 10 DISTINCT bilmodel, biltype, bilmaerke, motor, Count(bilmodel) AS antal
FROM items
WHERE biltype='personbil' AND (bilmaerke LIKE '%tekst%' OR bilmodel LIKE '%tekst%' OR motor LIKE '%tekst%' OR hk LIKE '%tekst%') GROUP BY bilmodel, biltype, bilmaerke, motor

UNION

SELECT TOP 10 DISTINCT bilmodel, biltype, bilmaerke, motor, Count(bilmodel) AS antal
FROM items
WHERE biltype='lastbil' AND (bilmaerke LIKE '%tekst%' OR bilmodel LIKE '%tekst%' OR motor LIKE '%tekst%' OR hk LIKE '%tekst%') GROUP BY bilmodel, biltype, bilmaerke, motor
Avatar billede rane Nybegynder
29. juni 2006 - 09:14 #13
Den der UNION...var simpelthen genial...for det virker! Smid lige et svar nielle :)
Avatar billede nielle Nybegynder
29. juni 2006 - 09:21 #14
Svar :^)
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