webForumDet fria alternativet

Strul med GROUP BY

Databaser & SQL

16 svar · 296 visningar · startad av G8

Medlem sedan jan. 20011 213 inlägg
Frågan#1

Jag använder mig av följande kodsnutt, och den verkar skriva ut rätt, men jag skulle vilja ha idrotter.region = 0 överst oavsett vad som finns mer i databasen, och därefter ska resten komma...

GROUP BY idrotter.region, idrotter.namn ORDER BY regioner.namn, idrotter.namn asc"

Editering: Hur skall man skriva för att skriva ut en GROUP i taget sen? Jag menar, vill ju skriva ut alla dör idrotter.region=0, sedan en radbrytning och därefter regioner.namn i stigande ordning...

Jag får inte till själva utskriften riktigt heller, skriver ut allt i en klump eller en radbrytning efter varje region...

Mvh

//G8

Medlem sedan dec. 200012 464 inlägg
#2
ORDER BY case region.id when 0 then 0 else 1 end
  region.namn, idrotter.namn

Red:

Varför har du group by då?

Medlem sedan jan. 20011 213 inlägg
#3

för att jag vill att den ska skriva ut i grupper om grupp, där region=0 överst och sedan fallande...

alltså så att det blir nått i stil med..

FOR EACH GROUP
response.write(<%="rs.region"%>"<p/>)
GROUP.MOVENEXT
LOOP

Jo, jag vet att den koden inte finns, men det kanske förklarar lite bättre hur jag vill att det ska fungera.. ;)

Mvh

//G8

Medlem sedan dec. 200012 464 inlägg
#4

Jo, men så blir det inte om du har med group by. Ta bort det.

Det viktiga är order by

set rs = connect.execute(sql)
region = ""
while not rs.eof
  if rs("region") <> region then
'
'skriv ut region
'
    region = rs("region")
 end if
'
'skriv ut idrotter
'
  rs.movenext
wend
Medlem sedan jan. 20011 213 inlägg
#5

Men eftersom det kan finnas flera idrotter inom en och samma GROUP, så måste bli nått i stil med:

stm = "hämta data om regioner och idrotter GROUP BY idrotter.region, idrotter.namn ORDER BY regioner.namn, idrotter.namn asc"
rs1 = connection.execute("stm")
FOR EACH GROUP
stm2 = "hämtar information ang. de klubbar som finns registerade i aktuell idrott"
rs2 = connection.execute("stm2")
do until rs2.eof
response.write(<%=rs("region")%>, <%=rs2("klubbnamn")%>"<p/>)
rs2.movenext
loop
GROUP.MOVENEXT
LOOP

Ja, nått sånt där måste det väl bli antar jag...

Medlem sedan jan. 20011 213 inlägg
#6

Du hann visst för LarsG, påverkar mitt ovanstående inlägg nånting... ?

Mvh

Medlem sedan dec. 200012 464 inlägg
#7

Om group by är relevant eller inte beror på vad du hämtar, dvs hur select-listan ser ut. Vad vill du göra?

Medlem sedan jan. 20011 213 inlägg
#8

:)

Min nuvarande kod:

<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td bgcolor="#3D4B5B">
<table width="504" border="0" cellpadding="0" cellspacing="1">

<%
Sportid = request.querystring("LID")
set connection = Server.CreateObject("ADODB.Connection")
Connection.Open "databasen"
count = 1

stm = "SELECT idrotter.id AS idrottsid, idrotter.namn AS idrottsnamn, idrotter.antal_klubbar, idrotter.aktiv, idrotter.Senaste_matchen, idrotter.region, regioner.namn AS idrottsregion FROM idrotter INNER JOIN regioner ON regioner.id = idrotter.region WHERE idrotter.idrottsid="& Sportid &" AND aktiv=-1 GROUP BY idrotter.region, idrotter.namn ORDER BY regioner.namn, idrotter.namn asc"
%>

<tr> 
<td width="150" height="20">&nbsp;Idrott</td>
<td width="194" align="center">Ledare</td>
<td width="53" align="center">Region</td>
<td width="42" align="center">Klubbar</td>
<td width="59" align="center">Aktiv</td>
</tr>

<%
Do until rs1.eof

stm2 = "SELECT klubbar.id AS klubbid, klubbar.namn AS klubbnamn, klubbar.poang, klubbar.deleted, klubbar.hibernate, regioner.namn FROM klubbar INNER JOIN regioner ON klubbar.region = regioner.id WHERE klubbar.idrott="& rs1("idrottsid") &" AND klubbar.deleted=0 AND klubbar.hibernate=0 ORDER BY klubbar.poang desc"
set rs2 = Connection.Execute(stm2)

'lite kod för att växelvis ändra färg på cellerna i tabellen
if count mod 2 = 0 then
bgcolor = "#9AACBE"
else
bgcolor = "#BDC9D5"
end if
%>
<tr>

<%if rs2.eof then%>
<td bgcolor="<%=bgcolor%>"><img src="images/<%=rs1("idrottsnamn")%>.gif" alt=" <%=rs1("idrottsnamn")%> " width="150" height="13" border="0"></td>
<td align="center" bgcolor="<%=bgcolor%>">Inga registrerade klubbar</td>
<td align="center" bgcolor="<%=bgcolor%>"><img src="images/flags/na.gif" alt=" N/A " width="14" height="12"></td>
<td align="center" bgcolor="<%=bgcolor%>">0</td>
<td align="center" bgcolor="<%=bgcolor%>"><img src="images/no.gif" alt=" NO " width="23" height="13" border="0"></td>

<%else%>

<td bgcolor="<%=bgcolor%>"><a href="lista.asp?LID=<%=rs1("idrottsid")%>&SPORT=<%=SERVER.URLEncode(namn)%>&Idrott=<%=SERVER.URLEncode(rs1("idrottsnamn"))%>"><img src="images/<%=rs1("idrottsnamn")%>.gif" alt=" <%=rs1("idrottsnamn")%> " width="150" height="13" border="0"></a></td>
<td align="center" bgcolor="<%=bgcolor%>"><a href="klubbinfo.asp?klubbid=<%=rs2("klubbid")%>"><%=rs2("klubbnamn")%></a></td>
<td align="center" bgcolor="<%=bgcolor%>"><img src="images/flags/<%=rs2("namn")%>.gif" alt=" <%=rs2("namn")%> " width="14" height="12"></td>
<td align="center" bgcolor="<%=bgcolor%>"><%=rs1("antal_klubbar")%></td>
<td align="center" bgcolor="<%=bgcolor%>"> 
<%
Datum = DateDiff("d", Date, rs1("senaste_matchen"))
if CINT(datum) >= -21 then
response.write("<img src=" & "images/yes.gif" & " " & "alt=" & " YES " & " " & "width=" & "23" & " " & "height=" & "13" & " " & "border=" & "0" & ">")
else
response.write("<img src=" & "images/no.gif" & " " & "alt=" & " NO " & " " & "width=" & "23" & " " & "height=" & "13" & " " & "border=" & "0" & ">")
end if
%>
</td>
<%end if%>
</tr>
<%
count = count + 1
rs1.MoveNext
Loop
Rs1.Close
set rs1 = Nothing
Connection.close
Set connection = Nothing
%>
</table>
</td>
</tr>
</table>

Jag vill alltså att den skall lista så här:

Region: Internationellt
Fotboll -> Klubben FF -> flagga
Basket -> Klubben BC -> flagga

region: Blekinge
Hockey -> Klubben HC -> flagga
Bandy -> Klubben BK -> flagga
Pingis -> Klubben BTK -> flagga

Region: Halland
Fotboll -> IFK Klubben -> flagga
Pingis -> BTK Klubben -> flagga

Alltså, börja med region inernationellt (region=0) och sedan lista resterande regioner efter namn, i fallande ordning...

Blev det klarare nu?

Mvh

//G8

Medlem sedan dec. 200012 464 inlägg
#9

Det skall inte vara någon group by i detta läge. Group är till för att ta bort duplikat.

Medlem sedan jan. 20011 213 inlägg
#10

ahh, ok...

hur 17 ska jag då få till en gruppering?

Min kunskap sträcker sig inte mkt längre än så här... :r

Mvh

//G8

Medlem sedan dec. 200012 464 inlägg
#11

Det blir med order by och att du sköter om det i ASP så som jag beskrev.

Medlem sedan jan. 20011 213 inlägg
#12

Hmm, har äntligen fått ordning på grupperingen, samt att avsluta tabbeler/tabellraderna rätt...

Var tvungen att gå ut en sväng och rensa skallen... ;)

Nu är det bara att få sorteringen i rätt ordning...

använder jag:

ORDER BY case region.id when 0 then 0 else 1 end,  region.namn, idrotter.namn

så sorterar den fortfarande i bokstavsordning, gör alltså inget undantag för region.id=0 som jag vill ha överst. Jag la till ett kommatecken efter end, får felmeddelande annars... påverkar det nått?

Kan jag lägga till flera kriterier i "ORDER BY Case", så att man t.ex. placerar region.id=0 först, sedan vill man ha region.id=24, sedan region.id=21 för att därefter sortera resten i fallande bokstavsordning?

Mvh

//G8

Medlem sedan jan. 20011 213 inlägg
#13

Fick till det till slut tror jag..

ORDER BY case when region.id  = 0 then 0 else 1 end,  region.namn, idrotter.namn

Region.id ska visst stå efter "when"...

//G8

Medlem sedan jan. 20011 213 inlägg
#14

btw: går det att bygga visare på order by case för att inkludera fler reservationer i sorteringen, typ:

ORDER BY case when region.id  = 0 then region.id=14 then region.id=17 else 1 end,  region.namn, idrotter.namn

Har testat att göra så som övan men det verkar ju inte fungera...

nån?

Mvh

//G8

Medlem sedan jan. 20011 213 inlägg
#15

Busenkelt ju... :)

ORDER BY case when region.id  = 0 then 0 else 1 end,  case when region.id  = 27 then 0 else 1 end, region.namn, idrotter.namn

Bara att lägga till en "case" sats ktill så löser det sig :)

//G8

Medlem sedan dec. 200012 464 inlägg
#16

Du kan ha flera when i en case

ORDER BY case when region.id  = 0 then 0 
                         when region.id  = 27 then 1 else 2 end,
region.namn, idrotter.namn

eller så kan du skriva

ORDER BY case region.id  
                when 0 then 0 
                when 27 then 1 else 2 end,
region.namn, idrotter.namn
Medlem sedan jan. 20011 213 inlägg
#17

Ok, det ser ju lite mer överskådligt ut kanske... ;)

Tack

//G8

271 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)