Simon Hiort-Lorenzen wrote:
> Hej,
>
> Jeg er ved at lave en download statistik på min side. I den forbindelse
> laver jeg den her forespørgsel for at få antal downloads pr time d.
> 20-03-03:
>
> SELECT HOUR (time) as hour , count( * ) as number
> FROM dlstat
> WHERE file = 'TinCamB2.exe'
> AND DAYOFMONTH( time ) = 20
> AND MONTH (time) = 3
> AND YEAR( time ) = 2003
> GROUP BY hour
> ORDER BY hour DESC
>
> Jeg får:
>
> hour number
> 23 1
> 22 2
> 21 2
> 19 1
> 17 1
> osv.
>
> Mit spørgsmål er om det kan lade sig gøre at de timer med hvor der er 0
> downloads, altså:
>
> hour number
> 23 1
> 22 2
> 21 2
> 20 0
> 19 1
> 18 0
> 17 1
> osv.
>
> Hvordan vil man gøre det?
Du kan ikke hente noget ud, som ikke er der
Da de timer, hvor der er
0 downloads af gode grunde ikke er i din tabel, må du hente dem et andet
sted fra.
Hvis du insisterer på at gøre det fra databasen (jeg kan ikke vurdere om
det et der smarteste for dig), så kan du gøre det ved at oprette en
tabel, der indeholder alle timer.
Altså
create table hours(
h int not nul);
insert into timer (0);
insert into timer (1);
....
insert into timer (23);
Join derefter denne tabel på din oprindelige forespørgsel (med lidt
modifikation):
SELECT h as hour , count( dlstat.time ) as number
FROM hours
left outer join dlstat
on h = hour(dlstat.time)
and file = 'TinCamB2.exe'
AND DAYOFMONTH( time ) = 20
AND MONTH (time) = 3
AND YEAR( time ) = 2003
GROUP BY h
ORDER BY h DESC
Bemærk:
- det er vigtigt at tælle på dlstat.time frem for *, da vi skal have
smidt NULL-værdierne væk.
- det er vigtigt at lægge alle betingelser ind under on-clausulen, da vi
ellers ødelægger hele pointen med et outer-join.
- jeg har ingen anelse om det her vil køre på dit system. Men det er
korrekt efter SQL-92 standarden.
--
--
Kristian Damm Jensen | Feed the hungry at
www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.