webForumDet fria alternativet

Grupera i tidsintervall

9 svar · 280 visningar · startad av JohnW

JohnWMedlem sedan feb. 20035 inlägg
#1

Hejsan!

Jag använder följande sql för att selecta en kolumn med tid i olika intervaller:

SELECT iif(match_stats.tid <= 15, '0-15', iif(match_stats.tid <= 30, '15-30', iif(match_stats.tid <= 45, '30-45', iif(match_stats.tid <= 60, '45-60', iif(match_stats.tid <= 75, '60-75', '75-90'))))) As intervall, count(*) As antal 
FROM [match], match_stats
WHERE (year(match.datum)=year(Date())) And (match.lag='A') And (match_stats.matchId=match.id) AND (match_stats.mål = True)
GROUP BY iif(match_stats.tid <= 15, '0-15', iif(match_stats.tid <= 30, '15-30', iif(match_stats.tid <= 45, '30-45', iif(match_stats.tid <= 60, '45-60', iif(match_stats.tid <= 75, '60-75', '75-90')))));

Men jag får inte ut något intervall om det saknas ett värde i något intervall.
Nån som vet hur man gör det?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Du får skapa en tabell till och lagra start/slut för alla intervall som du vill kunna få fram

create table dummy(iStart int, iEnd int)

insert into dummy values(0,15)
insert into dummy values(16,30)
-- etc

och sedan

SELECT cstr(iStart) & '-' & cstr(iEnd) As intervall, 
count(*) As antal 
FROM (dummy left outer join match_stats 
on match_stats.tid between iStart and iEnd) 
inner join [match]
on  (year(match.datum)=year(Date()) 
And match.lag='A'
And match_stats.matchId=match.id)
AND match_stats.mål = True)
GROUP BY iStart,iEnd
JohnWMedlem sedan feb. 20035 inlägg
#3

Tack för hjälpen LarsG. :)
Jag provade det du föreslog, det låter bra men jag får det inte att fungera.
Får felmeddelandet: "Between operator without And in query expression 'between iStart and iEnd'.

Vet du varför?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Det kan ju vara access som har lite begräsningar på vilka villkor man får använda i on. Man kan ju skriva om det enligt

SELECT cstr(iStart) & '-' & cstr(iEnd) As intervall, 
count(*) As antal 
FROM (dummy left outer join match_stats 
on match_stats.tid >= iStart 
and match_stats.tid <= iEnd) 
inner join [match]
on  (year(match.datum)=year(Date()) 
And match.lag='A'
And match_stats.matchId=match.id)
AND match_stats.mål = True)
GROUP BY iStart,iEnd
JohnWMedlem sedan feb. 20035 inlägg
#5

Nu får jag "Join expression not supported". :(

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Lite extra parenteser brukar lösa de flesta problemen av den sorten.

SELECT cstr(iStart) & '-' & cstr(iEnd) As intervall, 
count(*) As antal 
FROM (dummy left outer join match_stats 
on (match_stats.tid >= iStart 
and match_stats.tid <= iEnd) )
inner join [match]
on  (year(match.datum)=year(Date()) 
And match.lag='A'
And match_stats.matchId=match.id)
AND match_stats.mål = True)
GROUP BY iStart,iEnd

(Jag har inte någon Access-miljö att testa i.)

JohnWMedlem sedan feb. 20035 inlägg
#7

Samma fel, "Join expression not supported".
Och sen markerar Access texten "match_stats.tid >= iStart
and match_stats.tid <= iEnd".

Jag gjorde samma gissning som dig och satte dit några extra parenteser, men utan framgång.

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Jaha, får väl tänka om lite då. Det kanske bara går att jämföra med =.

SELECT cstr(iStart) & '-' & cstr(iEnd) As intervall, 
count(*) As antal 
FROM (dummy left outer join match_stats 
on (match_stats.tid\15 = iStart\15 ))
inner join [match]
on  (year(match.datum)=year(Date()) 
And match.lag='A'
And match_stats.matchId=match.id)
AND match_stats.mål = True)
GROUP BY iStart,iEnd
JohnWMedlem sedan feb. 20035 inlägg
#9

:(

Samma fel - klagar på "match_stats.tid\15 = iStart\15 ".

Jag förstår inte riktigt alla joins så jag har svårt att hänga med.

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Hmm, jag kan förklara vad jag försöker göra

dummy left outer join match_stats 
on (match_stats.tid\15 = iStart\15 )

innebär att man får alla poster från tabellen dummy oavsett om det finns matchande poster i tabellen
match_stats.
Om det inte finns några matchande poster i den högra (match_stats) tabellen så får man en post med
bara null i den högra tabellens kolumner.
På så sätt får man minst en post för varje intervall.

\ betyder heltalsdivision

Resultatet av denna join matchas sedan mot tabellen match. Här behövs också en outer join för annars så försvinner de poster som innehåller null.
Jag upptäckte att det var en parentes för mycket i frågan. Vet ej om det har någon betydelse men kan vara värt att testa.

SELECT cstr(iStart) & '-' & cstr(iEnd) As intervall, 
count(*) As antal 
FROM (dummy left outer join match_stats 
on (match_stats.tid\15 = iStart\15 ))
left outer join [match]
on  (year(match.datum)=year(Date())
And match.lag='A'
And match_stats.matchId=match.id
AND match_stats.mål = True)
GROUP BY iStart,iEnd

Om detta inte fungerar så vt jag inte riktigt hur man skal göra med Jet SQL. Det går ju alltid att hantera det i klienten när man skriver ut data, då man kontrollera om ett intervall saknas.

q = "SELECT iif(match_stats.tid <= 15, '0-15', iif(match_stats.tid <= 30, '15-30', iif(match_stats.tid <= 45, '30-45', iif(match_stats.tid <= 60, '45-60', iif(match_stats.tid <= 75, '60-75', '75-90'))))) As intervall, count(*) As antal 
FROM [match], match_stats
WHERE (year(match.datum)=year(Date())) And (match.lag='A') And (match_stats.matchId=match.id) AND (match_stats.mål = True)
GROUP BY iif(match_stats.tid <= 15, '0-15', iif(match_stats.tid <= 30, '15-30', iif(match_stats.tid <= 45, '30-45', iif(match_stats.tid <= 60, '45-60', iif(match_stats.tid <= 75, '60-75', '75-90'))))) order by match_stats.tid"

set rs = connect.execute(q)
pTid = 0
while not rs.eof
  if cint(rs("tid") ) - pTid > 15 then
     'missat intervall skriv ut lämplig info
     pInt = cint(rs("tid"))
  else
     'skriv ut som vanligt
  end if
  rs.movenext
wend
140 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)