Just nu i M3-nätverket
Gå till innehåll

Gruppera efter dag i sql fråga


Wippika

Rekommendera Poster

Hej

 

jag vill gruppera alla poster efter dag? Nu har jag gjort så här..

 

select c_date, count(*) as oc From Hits Where Customer_Id ="& Session("Customer_id") &" and Page_Id ="& Session("page_id") &" group by left(c_date,10) order by 2 Desc

 

saken är ju bara den att 1 januari 2007 och 1 januari 2006 grupperas ju som en. HUr ska man göra för att det inte ska hamna i samma grupp?

 

 

Mvh

 

Länk till kommentar
Dela på andra webbplatser

Helt enkelt för att du ber den gruppera på de 10 första tecknen i datum fältet

[b]left[/b](c_date,[b]10[/b])

 

Länk till kommentar
Dela på andra webbplatser

jo jag kom på det, men hur ska man göra för att få till det då?

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Varför inte bara gruppera det på hela datumet om du ändå ska ha en gruppering per dag. Dvs. GROUP BY DATE(c_date)

(MySql va?)

 

[inlägget ändrat 2007-05-14 20:48:46 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

c_date innehåller ju datum och tid... blir det rätt om man kör right(left(c_date,10),7)??

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Jag förstår inte, c_date är väl av typen datetime (om inte så föreslår jag att du gör om det).

 

Länk till kommentar
Dela på andra webbplatser

jag provade med date men fick detta felet?

 

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

 

[Microsoft][ODBC SQL Server Driver]

'date' is not a recognized built-in function name. 

 

/tware.asp, line 247

 

 

 

Kanske ska tillägas att jag gått över till MS sql nu istället...

 

 

Länk till kommentar
Dela på andra webbplatser

går inte redigera inlägg så jag kör ett till med sql frågan

 

	SQL = "Select avg(oc) as av from (select count(*) as oc from Hits where id="& Session("id") &" and page_id="& Session("page_id") &" group by DATE(c_date)) dt;"

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
Kanske ska tillägas att jag gått över till MS sql nu istället..

Ok, jag trodde det rörde sig om MySQL. Pröva detta då:

GROUP BY YEAR(c_date)+MONTH(c_date)+DAY(c_date)

 

Länk till kommentar
Dela på andra webbplatser

dåligt av mig som inte skriver ut tillräckligt med info. Butte igår för att det var massa buggar med mysql när man skulle använda avg och sum..

 

Nu funkade det

 

men vad gör "+" tecknen ??

 

och varför blir det inte rätt när man kör left(c_date,10) då visas ju datumet och om man grupperar efter det så borde väll "2006-01-01" vara en grupp och "2007-01-01" vara en grupp, så varför hamnar dom under samma??

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
och varför blir det inte rätt när man kör left(c_date,10)

Eftersom c_date är av typen datetime så skall du inte använda stränghanteringsfunktioner direkt på detta. Se om du får samma fel om du konverterar det först

GROUP BY LEFT(CAST (c_date AS string),10)

 

Länk till kommentar
Dela på andra webbplatser

det med string ger bara massa fel så den var inge bra. Men sen att köra

med GROUP BY YEAR(c_date)+MONTH(c_date)+DAY(c_date)

 

ger ett riktigt konstigt datumformat.. så här ser koden ut nu:

SELECT     YEAR(c_Date) + MONTH(c_Date) + DAY(c_Date) AS Expr1, COUNT(*) AS oc
FROM         Hits
WHERE     (Page_ID = 1) AND (ID = 2)
GROUP BY YEAR(c_Date) + MONTH(c_Date) + DAY(c_Date)
ORDER BY Expr1 DESC

 

fältet "expr1" får ju konstiga värden ?

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Sorry, bakisen får en att tänka lite trögt =) YEAR,MONTH och DAY returnerar heltal, så en typkonvertering måste göras först. Men skit i det och gör bara följande:

SELECT c_Date AS Expr1, COUNT(*) AS oc
FROM Hits
WHERE (Page_ID = 1) AND (ID = 2)
GROUP BY c_Date ORDER BY Expr1 DESC

Funkar bra när jag testar, dvs. den tar inte hänsyn till klockslaget vid grupperingen.

 

Länk till kommentar
Dela på andra webbplatser

nepp, kan inte få detta att fungera..

c_date innehåller ju tid och datum i detta formatet

2007-05-17 14:17:16

 

och det blir det som det grupperas efter, alltså måste ju stämma på sekunden för att det ska grupperas??

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
och det blir det som det grupperas efter, alltså måste ju stämma på sekunden för att det ska grupperas??

Hm, jag testade själv utan problem med ett datetimefält (förvisso med MSSQL 2000)

 

Länk till kommentar
Dela på andra webbplatser

men igentligen, om du bara väljer det fältet i sin helhet så borde det ju grupperas efter hela värdet i cellen, och inte bara datumet. eller?

 

hur som helst, sitter och provar i sql manager express.. kan man inte utvinna datumet bara ur en sådan cell??

 

försöker jag med DATE()

får jag detta felet:

Date is not recognized built-in function name??

 

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
kan man inte utvinna datumet bara ur en sådan cell??

Nej, det finns inga sådana möjligheter i sql server. Det du kan göra är att bygga om datumet utan tidsdelen. Titta ex. på den här länken

 

http://www.sql-server-helper.com/functions/get-date-only.aspx

 

men igentligen, om du bara väljer det fältet i sin helhet så borde det ju grupperas efter hela värdet i cellen, och inte bara datumet. eller?

Man tycker väl det, men det fungerade för mig. Har du testat?

 

 

 

Länk till kommentar
Dela på andra webbplatser

SELECT     c_Date AS Expr1, COUNT(*) AS oc
FROM         Hits
WHERE     (Page_ID = 1) AND (ID = 2)
GROUP BY c_Date
ORDER BY Expr1 DESC

 

jo då jag har testat ovanstående, tycker det är konstigt att det fungerar på din men inte min. Jag kör iofs mot en SQL 2005 men ändå..

Nu sitter jag och kör queryn från manager'n men det ska väll inte göra något, gjorde du samma, eller vad är det som kan skilja mellan våra då..

 

Tidsdelen behöver jag ha med då detta en funktion för att registrera besökarna på sidan för att sedan presentera det på olika sätt...

 

Länk till kommentar
Dela på andra webbplatser

Fan, skumt med eForum. Kan inte redigera mina inlägg. Står bara och tuggar när man trycker på uppdatera...

 

Fick en ide att prova denna: LEFT(c_Date, INSTR(c_Date," "))

men det verkar inte som funktionen INSTR funkar eller??

 

Länk till kommentar
Dela på andra webbplatser

Nu har det dykt upp en lösning..

 

SELECT AVG(oc) AS ac FROM (SELECT CONVERT(char(7), c_Date, 20) AS Expr1, COUNT(*) AS oc FROM Hits WHERE (ID ="& session("id") &" ) AND (Page_ID ="& session("page_id") &") GROUP BY CONVERT(char(7), c_Date, 20)) AS derivedtbl_1 ORDER BY ac DESC

 

kanske någon annan som har nytta av detta:)

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...