webForumDet fria alternativet

Skriv ihop till en SQL sats

14 svar · 704 visningar · startad av Calevan

CalevanMedlem sedan maj 20031 173 inlägg
#1

Hej!

Har denna kod för att plocka ut antalet träffar de senaste 20 dagarna. Det känns som jag borde kunna göra en bättre SQL fråga istället för att använda denna loop. Behöver dock lite hjälp, tack!

   strDag = Left(Now,10)

   For i = 0 To 19
    arrDagar(19-i) = day(strDag)

    strSQL = "SELECT count(IPnummer) FROM tblStatistikBesokare WHERE year(Tidpunkt)= " & year(strDag) & " AND month(Tidpunkt)= " & month(strDag) & " AND day(Tidpunkt)= " & day(strDag) 
    Set RecSet = Connect.Execute(strSQL)
    arrVarden(19-i) = RecSet(0)
    strDag = DateAdd("d", -1, strDag)
   Next
cyprysMedlem sedan dec. 20003 563 inlägg
#2
select count(ipnummer) as antal 
from tblStatistikBesokare 
where tidpunkt >= #dateadd(d,-20,date())#

edit
Om du vill ha antal för varje dag separat:

select tidpunkt, count(ipnummer) as antal 
from tblStatistikBesokare 
where tidpunkt >= #dateadd(d,-20,date())#
group by 1
CalevanMedlem sedan maj 20031 173 inlägg
#3

jag använder MSSQL så jag tog bort #-tecknerna. ändrade även "group by 1" till "group by tidpunkt", annars fick jag detta felmedelande:
"GROUP BY expressions must refer to column names that appear in the select list."

när jag skriver date() så får jag:
'date' is not a recognized function name.

och när jag skriver date, altså utan parenteser:
Invalid column name 'date'.

vad kan vara fel?

LarsGMedlem sedan dec. 200012 464 inlägg
#4
select tidpunkt, count(ipnummer) as antal 
from tblStatistikBesokare 
where tidpunkt between dateadd(d,-20,getdate()) and getdate()
group by tidpunkt
CalevanMedlem sedan maj 20031 173 inlägg
#5

gav mig följande (visar bara en del):

tidpunkt | Antal
2005-08-30 07:55:00 | 1
2005-08-30 12:03:00 | 1
2005-08-30 12:49:00 | 1
2005-08-30 14:43:00 | 1
2005-08-30 17:37:00 | 1
2005-08-30 20:51:00 | 1

Ser altså bra ut om man hade kunnat få att den bara kollar på datum och hoppar över klockslaget. Hur kan man göra det?

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Ja just det, det är en rimlig begäran.

select convert(varchar(10),tidpunkt,101) as tidpunkt, count(ipnummer) as antal 
from tblStatistikBesokare 
where tidpunkt between dateadd(d,-20,getdate()) and getdate()
group by convert(varchar(10),tidpunkt,101)
CalevanMedlem sedan maj 20031 173 inlägg
#7

Hej!

Det svaret som jag får ut från denna SQL sats vill jag ha in i två arrayer, en med "tidpunkt" (egentligen bara dag-delen av datumet) och en med "antal". Dessa skickas till en funktion som ritar upp det hela. Det blir dock ett problem om en dag saknar besökare, då blir det ju ingen rad i SQL satsen. Kan jag fixa det på SQL nivå, eller måste jag ta det när jag skapar arraysen? om det senare, hur kan man på ett smart sätt göra det?

stort tack för hjälpen hitils!

CalevanMedlem sedan maj 20031 173 inlägg
#8

Beskrev jag problemet dåligt eller har ni haft fullt upp? att någon vet svaret tvivlar jag inte en sekund på! :)

CalevanMedlem sedan maj 20031 173 inlägg
#9

plockar upp denna tråden igen ihop om att någon (LarsG kanske? :) ) har något smart att säga!

tack!

LarsGMedlem sedan dec. 200012 464 inlägg
#10
select convert(varchar(10),dateadd(d,-c,getdate()) as tidpunkt, count(ipnummer) as antal 
from (select 0 as c union all select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all select 7 union all
select 8 union all select 9 union all select 10 union all select 11 union all
select 12 union all select 13 union all select 14 union all select 15 union all
select 16 union all select 17 union all select 18 union all select 19) dt
left join tblStatistikBesokare 
  on convert(varchar(10),dateadd(d,-c,getdate()),101) = convert(varchar(10),tidpunkt)
where tidpunkt between dateadd(d,-20,getdate()) and getdate()
group by convert(varchar(10),dateadd(d,-c,getdate())

Om man gör sådant ofta kan man med fördel skapa en permanent tabell med integervärden. Annars så går det lika bra med en skriptbaserad lösning.

CalevanMedlem sedan maj 20031 173 inlägg
#11

fick detta:

Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'as'.
Server: Msg 170, Level 15, State 1, Line 6
Line 6: Incorrect syntax near 'dt'.

vad kan det bero på?

ser förstår jag inte riktigt hur jag skulle kunna göra en permanent tabell här, förutom att göra en jättetabell med alla dagar de närmast kommande åren och sätta antalet till noll, men det låter ju inte helt bra.

LarsGMedlem sedan dec. 200012 464 inlägg
#12

vad kan det bero på?

:) (Räkna parenteser och kontrollera argumenten till convert.)

select convert(varchar(10),dateadd(d,-c,getdate()),101) as tidpunkt, 
count(ipnummer) as antal                                                                
from (select 0 as c union all select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all select 7 union all
select 8 union all select 9 union all select 10 union all select 11 union all
select 12 union all select 13 union all select 14 union all select 15 union all
select 16 union all select 17 union all select 18 union all select 19) dt
left join tblStatistikBesokare
  on convert(varchar(10),dateadd(d,-c,getdate()),101) = convert(varchar(10),tidpunkt,101)
where tidpunkt between dateadd(d,-20,getdate()) and getdate()
group by convert(varchar(10),dateadd(d,-c,getdate()),101)

Du behöver inte lagra datum, det räcker med integervärden.

CalevanMedlem sedan maj 20031 173 inlägg
#13

Får fortfarande problem med de dagar som saknar poster i databasen. Tex den 2:a och den 3:e oktober vill jag gärna få ut i listan nedan fast med antal 0.

Detta resultat fick jag med din senaste kod:

tidpunkt antal
---------- -----------
09/19/2005 2
09/20/2005 1
09/21/2005 1
09/22/2005 1
09/25/2005 1
09/27/2005 2
09/28/2005 16
09/30/2005 1
10/01/2005 3
10/04/2005 4
10/05/2005 1
10/06/2005 3
10/07/2005 1

LarsGMedlem sedan dec. 200012 464 inlägg
#14

Ja, det är ju fortfarande rimliga önskemål

select convert(varchar(10),dateadd(d,-c,getdate()),101) as tidpunkt, 
count(ipnummer) as antal                                                                
from (select 0 as c union all select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all select 7 union all
select 8 union all select 9 union all select 10 union all select 11 union all
select 12 union all select 13 union all select 14 union all select 15 union all
select 16 union all select 17 union all select 18 union all select 19) dt
left join tblStatistikBesokare
  on convert(varchar(10),dateadd(d,-c,getdate()),101) = convert(varchar(10),tidpunkt,101)
and tidpunkt between dateadd(d,-20,getdate()) and getdate()
group by convert(varchar(10),dateadd(d,-c,getdate()),101)

Då det är en left outer join så må villkoren på den högra tabellen läggas i on och inte i where

CalevanMedlem sedan maj 20031 173 inlägg
#15

underbart! funkar perfekt! tack!

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