webForumDet fria alternativet

Gruppera intervall

10 svar · 284 visningar · startad av SB

SBMedlem sedan maj 2000194 inlägg
#1

Hej!

Jag använder mig av ett enda relevant fält i en Accessdatabas som lagrar viktvärden mellan 20 och 25 kg. Nu vill jag gruppera dessa viktvärden efter intervall på 0,5 kg och antal enligt följande:

Intervall Antal
20.0-20.5 x st
20.5-21.0 x st
21.0-21.5 x st
21.5-22.0 x st
22.0-22.5 x st osv.

Jag har suttit och laborerat med GROUP BY-satser och anrop av funktioner men kommer ingen vart. Jag hittar heller inga lösningar efter att ha sökt i forumet. Presentationen skall visas på en websida m h a ASP.

Någon som sitter inne med en bra lösning?

LarsGMedlem sedan dec. 200012 464 inlägg
#2
select  iif(weight <= 20.5, '20-20.5',
                           iif(weight <= 21.0,'20.5-21.0',
                             iif(weight <= 21.5,'21.0-21.5',
                          iif(weight <= 22.0,'21.5-22.0',
                             iif(weight <= 22.5,'22.0-22.5', 
                          iif(weight <= 23.0,'22.5-23.0',
                             iif(weight <= 23.5,'23.0-23.5', 
                          iif(weight <= 24.0,'23.5-24.0',
                             iif(weight <= 24.5,'24.0-24.5', 
                         '24.5-25.0'))))))))) as intervall,
   count(*) as antal
from t
group by 1
SBMedlem sedan maj 2000194 inlägg
#3

Tack för ditt svar, LarsG.

Din SQL-sats genererar inga fel men den returnerar heller inga poster vilket jag inte förstår.

rs.open "select iif(nettovikt <= 20.5, '20-20.5', 
iif(nettovikt <= 21.0,'20.5-21.0', 
iif(nettovikt <= 21.5,'21.0-21.5', 
iif(nettovikt <= 22.0,'21.5-22.0',  
iif(nettovikt <= 22.5,'22.0-22.5',  
iif(nettovikt <= 23.0,'22.5-23.0',  
iif(nettovikt <= 23.5,'23.0-23.5',  
iif(nettovikt <= 24.0,'23.5-24.0',  
iif(nettovikt <= 24.5,'24.0-24.5', '24.5-25.0'))))))))) as intervall, count(*) as antal 
from tblVikter 
Where Year(tblVikter.datum) = " & initYear & " AND tblVikter.datum = #" & dDatum & "# 
group by 1", conn, 2, 2

If rs.bof Or rs.eof Then
	%>
<tr><td colspan=3><font class="textred"><b>Det finns inga uppgifter för begärd period.</b></font></td></tr>
	<%
Else

arrayData3 = rs.GetRows()

rs.close

End If

Fältnamnet är döpt till nettovikt och är av typen Single. Det finns också garanterat värden i databasen inom alla intervaller. Jag kör mot en Access97-databas med MDAC 2.0.

Är det något jag har missat?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Du kan ju testa frågan direkt i Access

sql = " select iif(nettovikt <= 20.5, '20-20.5', " & _
" iif(nettovikt <= 21.0,'20.5-21.0', " & _
" iif(nettovikt <= 21.5,'21.0-21.5', " & _
" iif(nettovikt <= 22.0,'21.5-22.0', " & _
" iif(nettovikt <= 22.5,'22.0-22.5', " & _
" iif(nettovikt <= 23.0,'22.5-23.0', " & _
" iif(nettovikt <= 23.5,'23.0-23.5', " & _
" iif(nettovikt <= 24.0,'23.5-24.0', " & _
" iif(nettovikt <= 24.5,'24.0-24.5', '24.5-25.0'))))))))) as intervall, " & _
" count(*) as antal " & _
" from tblVikter " & _
" Where Year(tblVikter.datum) = " & initYear & _ 
" AND  tblVikter.datum = #" & dDatum & "# " & _
" group by 1"
response.write "SQL:" & sql

Det kan ha blivit något tjall med dina variabler.

SBMedlem sedan maj 2000194 inlägg
#5

Jag har testat att köra SQL-satsen utan WHERE-klausulen för att eliminera risken för tjall med variablerna initYear och dDatum. Dock så returneras fortfarande inga poster. Jag kan ju alltid lösa bekymret genom att lägga till ett extra fält i databasen där jag lagrar respektive intervall och sedan köra en GROUP BY på den kolumnen.

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Det verkar onödigt. Kan du testa delar av frågan? T.ex. att du tar bort count och group by och bara har kvar iif-delen. Sen så kan du också testa med att istället för group by 1 lägga dit hela uttrycket med iif.

SBMedlem sedan maj 2000194 inlägg
#7

Jag testade, som du sa, med att först ta bort count och group by, men utan resultat. När jag även tog bort WHERE-klausulen så returneras posterna.
Märkligt. Men jag måste nog ha med både villkoret och "count-fältet".

Sedan vet jag inte riktigt hur jag lägger till hela uttrycket med iif. Vill du hjälpa mig igen, LarsG?

LarsGMedlem sedan dec. 200012 464 inlägg
#8
sql = " select iif(nettovikt <= 20.5, '20-20.5', " & _
" iif(nettovikt <= 21.0,'20.5-21.0', " & _
" iif(nettovikt <= 21.5,'21.0-21.5', " & _
" iif(nettovikt <= 22.0,'21.5-22.0', " & _
" iif(nettovikt <= 22.5,'22.0-22.5', " & _
" iif(nettovikt <= 23.0,'22.5-23.0', " & _
" iif(nettovikt <= 23.5,'23.0-23.5', " & _
" iif(nettovikt <= 24.0,'23.5-24.0', " & _
" iif(nettovikt <= 24.5,'24.0-24.5', '24.5-25.0'))))))))) as intervall, " & _
" count(*) as antal " & _
" from tblVikter " & _
" Where Year(tblVikter.datum) = " & initYear & _ 
" AND  tblVikter.datum = #" & dDatum & "# " & _
" group by iif(nettovikt <= 20.5, '20-20.5', " & _
" iif(nettovikt <= 21.0,'20.5-21.0', " & _
" iif(nettovikt <= 21.5,'21.0-21.5', " & _
" iif(nettovikt <= 22.0,'21.5-22.0', " & _
" iif(nettovikt <= 22.5,'22.0-22.5', " & _
" iif(nettovikt <= 23.0,'22.5-23.0', " & _
" iif(nettovikt <= 23.5,'23.0-23.5', " & _
" iif(nettovikt <= 24.0,'23.5-24.0', " & _
" iif(nettovikt <= 24.5,'24.0-24.5', '24.5-25.0')))))))))"

så tänkte jag.

Har du testat med att ha kvar group by men utan where? Eftersom du får data om du tar bort where så tyder det på att det är där problemet ligger.

SBMedlem sedan maj 2000194 inlägg
#9

Hej igen!

Jag testade din senaste sats, men utan att några poster returnerades. Jag testade även samma fast utan Where-klausulen. Sedan måste jag erkänna att jag var lite slarvig innan. När jag inte tog med Where-klausulen så returnerades bara en post, nämligen den med intervallet 21.0-21.5 som ligger i mitten av hela spridningen. Har annars en spridning ganska jämnt fördelad mellan 19.5 och 25.5. Märkligt att bara en enda returneras.
Knepigt med histogram...

Har du några andra förslag, LarsG, annars lägger jag nog till ett extra textfälten med längden 15.

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Nej, inga förslag. Det verkar lite skumt beteende från Access.

SBMedlem sedan maj 2000194 inlägg
#11

Nej, men däremot klantigt beteende från undertecknad. Det var inga fel på SQL-satsen från början. Felet låg i min arrayhantering när jag skrev ut posterna.

For iRad = 0 To Ubound(arrayData3)

skall vara

For iRad = 0 To Ubound(arrayData3, 2)

Tack för din höga kompetens

Högaktningsfullt
/SB

126 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)