---
title: "Grupera i tidsintervall"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/73978-grupera-i-tidsintervall"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "JohnW"
published: "2003-04-13T12:02:06.000Z"
updated: "2003-04-14T16:17:49.000Z"
replies: 9
views: 280
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/73978-grupera-i-tidsintervall"
---

# Grupera i tidsintervall

## #1 — JohnW, 2003-04-13T12:02Z

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?

Permalänk: https://www.webforum.nu/p/73978

## #2 — LarsG, 2003-04-13T13:13Z

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
```

Permalänk: https://www.webforum.nu/p/1009787

## #3 — JohnW, 2003-04-13T15:34Z

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?

Permalänk: https://www.webforum.nu/p/1009875

## #4 — LarsG, 2003-04-13T15:40Z

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
```

Permalänk: https://www.webforum.nu/p/1009877

## #5 — JohnW, 2003-04-13T16:10Z

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

Permalänk: https://www.webforum.nu/p/1009893

## #6 — LarsG, 2003-04-13T16:13Z

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.)

Permalänk: https://www.webforum.nu/p/1009895

## #7 — JohnW, 2003-04-13T16:22Z

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.

Permalänk: https://www.webforum.nu/p/1009902

## #8 — LarsG, 2003-04-13T16:42Z

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
```

Permalänk: https://www.webforum.nu/p/1009922

## #9 — JohnW, 2003-04-13T16:46Z

:( 

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.

Permalänk: https://www.webforum.nu/p/1009926

## #10 — LarsG, 2003-04-14T16:17Z

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
```

Permalänk: https://www.webforum.nu/p/1010739

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/73978-grupera-i-tidsintervall
