Avatar billede airwolf Nybegynder
09. december 2006 - 15:00 Der er 21 kommentarer og
1 løsning

Count Sort Group between dates problem

Hejsa har denne query der sorterer og gruppere den virker fint.

SELECT certificat.PID, count(certificat.PID)  AS count_PID_1, products.P_Name
FROM (certificat
LEFT JOIN products ON products.PID=certificat.PID)
GROUP BY certificat.PID, products.P_Name

Den giver resultatet:
produkt 1    4 stk
produkt 2    3 stk
produkt 3    7 stk

osv...........

det jeg gerne skulle opnå er at man kan afgrænse queryen mellem 2 datoer.
har 2 dato felter start_date og end_date.

Men når jeg prøver at få datostyring med virker det ikke.
hvad går galt!!

jeg har prøvet alt bla denne her men den virker ikke:
SELECT certificat.PID, count(certificat.PID)  AS count_PID_1, products.P_Name,certificat.Cer_Date
FROM (certificat LEFT JOIN products ON products.PID=certificat.PID) GROUP BY certificat.PID, products.P_Name  WHERE certificat.Cer_Date >=KTColParam1 AND certificat.Cer_Date<=KTColParam2

De 2 KTColParam er Request.Form("start_date") og Request.Form("end_date")
Avatar billede erikjacobsen Ekspert
09. december 2006 - 15:22 #1
Hvad skriver du i Request.Form("end_date") og hvad er datatypen for certificat.Cer_Date ?
Avatar billede airwolf Nybegynder
09. december 2006 - 15:44 #2
Request.Form kommer fra 2 felter med hvor du vælger start dato og slut dato.

http://www.naviation.dk/Autoconcept/daterange1.asp
ved submit går man til næste side hvor der er jeg prøve at udtrække data.

datatype for certificat_Cer_Date er "Date" field.
Avatar billede erikjacobsen Ekspert
09. december 2006 - 15:46 #3
Hvis det er DATE felt, skal formatet ikke være '06-12-2006' med '2006-12-06'
Avatar billede erikjacobsen Ekspert
09. december 2006 - 15:47 #4
...ikke være '06-12-2006' men '2006-12-06'
Avatar billede airwolf Nybegynder
09. december 2006 - 15:55 #5
Bruger extensions fra interactonline. de indtastede datoer på skærmen bliver converteret før det når databasen....så det skulle gerne ende med '2006-12-06'
Avatar billede erikjacobsen Ekspert
09. december 2006 - 15:59 #6
Godt - så skal den del af det jo virke ;)

Hvordan får du sat værdien fra KTColParam1 ind i SQL-sætningen? Det du har vist er vel ikke den rigtige kode?
Avatar billede airwolf Nybegynder
09. december 2006 - 16:01 #7
Hvis jeg fjerner count og sort og kun kører med dato afgrænsning så virker
dato afgrænsningen.

prøv engang igen http://www.naviation.dk/Autoconcept/daterange1.asp

så dato felterne skulle være ok
Avatar billede airwolf Nybegynder
09. december 2006 - 16:04 #8
den der kører online lige nu er denne query
SELECT certificat.Cer_Date AS start_date, certificat.Cer_Date AS end_date, certificat.Cer_Date, certificat.CER_ID
FROM certificat
WHERE certificat.Cer_Date>=KTColParam1  AND certificat.Cer_Date<=KTColParam2

ved godt at query ikke bruger AS start_date og AS end_date
Avatar billede erikjacobsen Ekspert
09. december 2006 - 16:04 #9
Ok, der er nogle data mellem den 7. og 9. december, og ikke andre steder. Så det virker jo korrekt.
Avatar billede airwolf Nybegynder
09. december 2006 - 16:05 #10
<%
Dim Recordset1__KTColParam1
Recordset1__KTColParam1 = "0"
If (Request.Form("start_date") <> "") Then
  Recordset1__KTColParam1 = Request.Form("start_date")
End If
%>
<%
Dim Recordset1__KTColParam2
Recordset1__KTColParam2 = "0"
If (Request.Form("end_date") <> "") Then
  Recordset1__KTColParam2 = Request.Form("end_date")
End If
%>
<%
Dim Recordset1
Dim Recordset1_cmd
Dim Recordset1_numRows

Set Recordset1_cmd = Server.CreateObject ("ADODB.Command")
Recordset1_cmd.ActiveConnection = MM_nanocover_STRING
Recordset1_cmd.CommandText = "SELECT certificat.Cer_Date AS start_date, certificat.Cer_Date AS end_date, certificat.Cer_Date, certificat.CER_ID FROM certificat WHERE certificat.Cer_Date>=?  AND certificat.Cer_Date<=?"
Recordset1_cmd.Prepared = true
Recordset1_cmd.Parameters.Append Recordset1_cmd.CreateParameter("param1", 135, 1, -1, Recordset1__KTColParam1) ' adDBTimeStamp
Recordset1_cmd.Parameters.Append Recordset1_cmd.CreateParameter("param2", 135, 1, -1, Recordset1__KTColParam2) ' adDBTimeStamp

Set Recordset1 = Recordset1_cmd.Execute
Recordset1_numRows = 0
%>
Avatar billede airwolf Nybegynder
09. december 2006 - 16:07 #11
Yeps dato afgrænsning er ok men når jeg prøver at count og group er det det går galt
hver for sig virker de men sammen gør de ikke .....har bare stirret mig blind pådet her i 2 dage snart....
Avatar billede erikjacobsen Ekspert
09. december 2006 - 16:09 #12
Så skal du lige beskrive hvad du mener med "går galt" og "virker det ikke"
Avatar billede erikjacobsen Ekspert
09. december 2006 - 16:14 #13
I SQL-sætningen fra spørgsmålet har du et felt med i din SELECT ....,certificat.Cer_Date FROM... 
Hvad forventer du det indholder, når du udvælger flere datoer til samme gruppe (altså ikke har feltet med i din GROUP BY) ?
Avatar billede airwolf Nybegynder
09. december 2006 - 16:19 #14
Denne query svarer på dato afgrænsning og virker

SELECT certificat.Cer_Date AS start_date, certificat.Cer_Date AS end_date, certificat.Cer_Date, certificat.CER_ID
FROM certificat
WHERE certificat.Cer_Date>=KTColParam1  AND certificat.Cer_Date<=KTColParam2
----------------------
Denne query laver count og group og virker
SELECT certificat.PID, count(certificat.PID)  AS count_PID_1, products.P_Name
FROM (certificat
LEFT JOIN products ON products.PID=certificat.PID)
GROUP BY certificat.PID, products.P_Name
---------------------
Prøver at sætte dem sammen men får denne fejl:

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

[MySQL][ODBC 3.51 Driver][mysqld-5.0.22-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE certificat.Cer_Date >='20061012000000' AND certificat.Cer_Date<='200612160' at line 1

/Autoconcept/daterange3.asp, line 29


her er koden fra siden

<%
Dim Recordset1__KTColParam1
Recordset1__KTColParam1 = "1"
If (Request.Form("start_date")  <> "") Then
  Recordset1__KTColParam1 = Request.Form("start_date")
End If
%>
<%
Dim Recordset1__KTColParam2
Recordset1__KTColParam2 = "1"
If (Request.Form("end_date")  <> "") Then
  Recordset1__KTColParam2 = Request.Form("end_date")
End If
%>
<%
Dim Recordset1
Dim Recordset1_cmd
Dim Recordset1_numRows

Set Recordset1_cmd = Server.CreateObject ("ADODB.Command")
Recordset1_cmd.ActiveConnection = MM_nanocover_STRING
Recordset1_cmd.CommandText = "SELECT certificat.PID, count(certificat.PID)  AS count_PID_1, products.P_Name,certificat.Cer_Date FROM (certificat LEFT JOIN products ON products.PID=certificat.PID) GROUP BY certificat.PID, products.P_Name  WHERE certificat.Cer_Date >=? AND certificat.Cer_Date<=?"
Recordset1_cmd.Prepared = true
Recordset1_cmd.Parameters.Append Recordset1_cmd.CreateParameter("param1", 135, 1, -1, Recordset1__KTColParam1) ' adDBTimeStamp
Recordset1_cmd.Parameters.Append Recordset1_cmd.CreateParameter("param2", 135, 1, -1, Recordset1__KTColParam2) ' adDBTimeStamp

*****  Dette er line 29  ****Set Recordset1 = Recordset1_cmd.Execute
Recordset1_numRows = 0
%>
Avatar billede airwolf Nybegynder
09. december 2006 - 16:24 #15
øhh troede bare den skulle være der for at state de felter jeg arbejder med...
er lidt newbie med dette. skal den væk ??
Avatar billede erikjacobsen Ekspert
09. december 2006 - 16:31 #16
Nå ja, WHERE før GROUP BY  ;)
Avatar billede erikjacobsen Ekspert
09. december 2006 - 16:32 #17
Du må gerne have feltet som vi snakker om. Det giver en "tilfældig" af de datoer der er i gruppen. Men det virker kun i MySQL, og du vil få en fejl i fx. MS SQLserver.

Og det er egentlig rimeligt nok, for hvad skal man bruge en tilfældig af værdierne til ?
Avatar billede airwolf Nybegynder
09. december 2006 - 16:33 #18
Hvad mener du med WHERE før GROUP BY !! skal det byttes om eller noget
Avatar billede erikjacobsen Ekspert
09. december 2006 - 16:48 #19
Ja, hvis vi tager den fra spørgsmålet, så skal den være

SELECT certificat.PID, count(certificat.PID)  AS count_PID_1, products.P_Name,certificat.Cer_Date
FROM (certificat LEFT JOIN products ON products.PID=certificat.PID) WHERE certificat.Cer_Date >=KTColParam1 AND certificat.Cer_Date<=KTColParam2 GROUP BY certificat.PID, products.P_Name 

Og som sagt, hvis du havde sagt hvad det var der ikke virkede, så havde vi klaret den for en time siden ;)
Avatar billede airwolf Nybegynder
09. december 2006 - 16:58 #20
Utroligt  det virker sgu.....
1000 tak for hjælpen .....

ps.hvad gør jeg for at du får point  ??  er som sagt ny i dette
Avatar billede erikjacobsen Ekspert
09. december 2006 - 17:02 #21
Jeg samler slet ikke på point, tak. Svar selv, accepter eget svar.
Avatar billede airwolf Nybegynder
09. december 2006 - 17:06 #22
tak for det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester