Avatar billede skyum Nybegynder
20. december 2002 - 23:11 Der er 28 kommentarer og
3 løsninger

Select Max() Group by

Jeg skal have valgt den største værdi for forskellige grupper (ID). Men når jeg skriver bare en simpel foresprøgsel, får jeg kun den højeste værdi for en enkelt gruppe. Jeg har lavet forsøget i Acccess og får det rigtige resultat med nedennævnte løsning, men det virker ikke i ASP. Er der en ekspert, der kan fortælle mig hvorfor.
Kan man skrive id=rs("auk2emne.id") eller skal det bare være id=rs("auk2emne.id") -  har prøvet begge løsninger, men ved ikke om det virker, da sqlstmt jo heller ikke virker i  ASP

sqlstmt="SELECT auk2emne.id, Max(auk3bud.bud) AS MaksOfbud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id GROUP BY auk2emne.id"

set rs=Server.CreateObject("adodb.Recordset")
rs.Open sqlstmt, conn
bud2=rs("MaksOfbud")
gruppe=rs("gruppe")
budnr=rs("budnr")
id=rs("auk2emne.id")
Avatar billede medions Nybegynder
20. december 2002 - 23:17 #1
Du skriver skam bare:
sqlstmt="SELECT auk2emne.id, Max(auk3bud.bud) AS MaksOfbud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id GROUP BY auk2emne.id"

Set rs = conn.execute(strstmt)
rs("MaksOfbud")

//>Rune
//>Rune
Avatar billede eagleeye Praktikant
20. december 2002 - 23:25 #2
Hvis du havde ID ud skal man skrive rs("id")


id=rs("id")
Avatar billede eagleeye Praktikant
20. december 2002 - 23:27 #3
Hvis du hendter mere end en kolonne som hedder id så du nød til at lave et alias for det id du vil havde sådan her:


sqlstmt="SELECT auk2emne.id as auk2emneID, Max(auk3bud.bud) AS MaksOfbud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id GROUP BY auk2emne.id"

og så hendte det som:

id = rs("auk2emneID")
Avatar billede erikjacobsen Ekspert
20. december 2002 - 23:48 #4
Skal vi så ikke pensle det helt ud:

sqlstmt="SELECT auk2emne.id as id1, Max(auk3bud.bud) AS MaksOfbud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id GROUP BY auk2emne.id"

Set rs = conn.execute(strstmt)
while not rs.eof
  response.write rs("id1") & " er der " & rs("MaksOfbud") & "af<br>"
wend
Avatar billede medions Nybegynder
20. december 2002 - 23:53 #5
erikjacobsen> En lille rettelse til dig:

sqlstmt="SELECT auk2emne.id as id1, Max(auk3bud.bud) AS MaksOfbud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id GROUP BY auk2emne.id"

Set rs = conn.execute(strstmt)
while not rs.eof
  response.write rs("id1") & " er der " & rs("MaksOfbud") & "af<br>"
rs.movenext()
wend

Du manglede MoveNext() ;o)
//>Rune
Avatar billede erikjacobsen Ekspert
20. december 2002 - 23:58 #6
Øvse bøvse ... jeg havde ellers forsøgt at holde tungen lige i munden. ;)
Avatar billede medions Nybegynder
21. december 2002 - 00:00 #7
*G*
Avatar billede skyum Nybegynder
21. december 2002 - 12:56 #8
Set rs = conn.execute(strstmt)
Skal være:  Set rs = conn.execute(sglstmt)
Der er nu hul igennem, men min side er helt blank. Der er data i min mySQL_DB, som er hentet ned i Access, hvor den er testet.
Har I et bud på hvorfor resultatet er blankt?
Avatar billede skyum Nybegynder
21. december 2002 - 13:16 #9
Nu går der helt ged i det. SKAL være: Set rs = conn.execute(sqlstmt)
Avatar billede eagleeye Praktikant
21. december 2002 - 16:01 #10
Det kan være lidt svært at gætte uden at kende lidt til koden eller princippet i koden. En ting kunne være du får et tomt recordset og dermed e siden blank.
Avatar billede skyum Nybegynder
21. december 2002 - 16:21 #11
Men da koden er taget direkte fra Access og Acces viser det ønskede reultat, så burde det være korrekt. Der kun er ændret m.h.s til de 2 alias. Havde feltnavne været forkerte ville, der være kommet en fejlmeddelelse. Jeg kigger lige lidt nærmere. Jeg vender tilbage (I skal nok få jeres point)
Avatar billede skyum Nybegynder
21. december 2002 - 17:10 #12
Hvis jeg i stedet indsætter denne mere simple forespørgsel
sqlstmt="SELECT auk2emne.id, auk3bud.bud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id = auk3bud.id"

så får jeg det resultat, jeg tidligere har fået. Der må således være et problem omkring brugen af functionerne max og count -  (har tillige prøvet count uden resultat.)
Avatar billede erikjacobsen Ekspert
21. december 2002 - 19:17 #13
Prøv
sqlstmt="SELECT auk2emne.id as id1 FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id GROUP BY auk2emne.id"

og udskriv rs("id1")  -- hvad sker der?
Avatar billede skyum Nybegynder
21. december 2002 - 22:15 #14
Så bliver resultatet:
rs("id1") er der rs("id1")af;
2 er der 2af
3 er der 3af
Hvis jeg indsætter yderligere max(auk3bud.mnr) as bud - for at teste på et andet felt får jeg igen blank side-
Jeg har læst et andet sted her på Eksperten, at der måske kan være problemer med softwaren hos Azero. Kan det mon være tilfældet.
Avatar billede eagleeye Praktikant
21. december 2002 - 22:23 #15
Det tror jeg nu ikke, jeg har selv Azero og har aldrig haft problemmet med dem...

HVis du Joiner to tabeller og den du joiner på ikke har en record der passer med ID eller kolonne mnr er tom så vil du få en blank side.
Avatar billede skyum Nybegynder
21. december 2002 - 22:36 #16
Der er inge af de angivene felter der er tomme. Indsætter jeg i stedet for rs("id1") rs("bud") jf ovenfor, så får jeg hhv. 2 er der 110 af
3 er der 100 af. Men funktionerne max, min avg o.s.v giver blank side.
Avatar billede eagleeye Praktikant
21. december 2002 - 22:40 #17
Så prøv at droppe GROUP BY når du bruger max:

sqlstmt="SELECT auk2emne.id as id1 max(auk3bud.mnr) as bud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id"

Max,min,avg returnere kun en record og ikke en for hver ID.
Avatar billede skyum Nybegynder
21. december 2002 - 22:47 #18
Jeg har lige konstateret, at det er ligemeget hvad der står i Max(, siden bliver blank, men burde vel komme med en fejl meddelelse. Jeg prøver lige at droppe group by, men mener at den vil have det.
Avatar billede skyum Nybegynder
21. december 2002 - 22:51 #19
Det giver også blank side. Men der kan jo ikke være noget galt med select, når den er taget direkte fra Access og så rettet til med ". Det virker i Access.
Avatar billede eagleeye Praktikant
21. december 2002 - 22:59 #20
Hvis du bruger MAX,MIN mm så vil den kun returnere en record og man kan ikke GRUOP BY enkolnne og få max af en anden komme for hvert tal i enkolnne..

enkolnne andenkolonne
  1          10
  1          11
  2          22
  2          44


Så kan man ikke:
sqlstmt="SELECT auk2emne.id as id1 max(auk3bud.mnr) as bud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id GROUP BY auk2emne.id"

enkolnne andenkolonne
  1          11
  2          44


Hvis du gør sådan her:
sqlstmt="SELECT auk2emne.id as id1 max(auk3bud.mnr) as bud FROM auk2emne INNER JOIN auk3bud ON auk2emne.id=auk3bud.id"

Skulle denb gerne give dette:
enkolnne andenkolonne
  2          44
Avatar billede skyum Nybegynder
21. december 2002 - 23:15 #21
Ja, det er det jeg får med Access, men jeg får det i ASP (mySQL).
Uanset det er med eller uden group by. Jeg kan læse formlerne alle steder, men selvom jeg laver en simpel uden join m.v. så kan den ikke, når jeg bruger max(). Det må være noget software. Jeg prøver på min Linux maskine i morgen (skal lige sættes til), hvis der er andre, der har et bud hører jeg gerne. Jeg synes I alle har gjort en flot indsats (det synes jeg I gør generelt på denne side, hvor jeg har noteret mig jeres hjælpsomhed, som må betegnes som uvurderlig).
Avatar billede skyum Nybegynder
21. december 2002 - 23:19 #22
Der skal naturligvis stå: men jeg får det IKKE i ASP (mySQL).
Avatar billede erikjacobsen Ekspert
21. december 2002 - 23:37 #23
Hvilket webhotel? Eller server?
Avatar billede erikjacobsen Ekspert
21. december 2002 - 23:39 #24
Jeg kommer til at tænke på et bestemt webhotel, hvor
der sker mystiske ting. Måske er det dem, måske er det
ASP/MySql generelt.

Prøv at droppe alle "AS navn", og prøv så at få
tingene af dit recordset alene med numre, rs(0) og rs(1).

Det kunne da være....
Avatar billede eagleeye Praktikant
21. december 2002 - 23:41 #25
Han har Azero.dk
Avatar billede erikjacobsen Ekspert
21. december 2002 - 23:46 #26
Ok - det er så ikke det webhotel med de mystiske hændelser, som jeg
tænker på. Men jeg håber han får prøvet forslaget.
Avatar billede skyum Nybegynder
21. december 2002 - 23:46 #27
Det er Azero, Pernille og Birgitte servere. Jeg har prøvet at droppe alias, men uden held. Jeg giver den dog et forsøg igen. Har også checket at feltet er et int.
Avatar billede erikjacobsen Ekspert
21. december 2002 - 23:50 #28
Vis os lige koden du prøver - hvad enten den virker eller ej :)
Avatar billede skyum Nybegynder
28. december 2002 - 12:59 #29
Jeg har nu test med en anden tabel og her virker funktionen. Jeg har forsøgt at ændre feltnavn, tabelnavn, key m.v men intet hjælper. Jeg tror derfor ikke, jeg kommer videre med denne tabel og forsøger mig med en ny opsætning. Det er dog ærgerligt, at det ikke er muligt at finde fejlen. Tak for hjælpen.
Avatar billede skyum Nybegynder
28. december 2002 - 16:40 #30
Jeg fandt ud, af at fejlen skyldes datatypen. Jeg havde anvendt INT i den col. der skulle søges i. Den gav en blank side. Efter at have ændret den til FLOAT, ja så virker den.
Avatar billede erikjacobsen Ekspert
28. december 2002 - 17:06 #31
Mærkeligt ... det burde ikke gøre nogen forskel.
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