09. december 2006 - 15:00Der 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")
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'
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
<% 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 %>
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....
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) ?
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 %>
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 ?
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 ;)
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.