15. juli 2002 - 19:37Der er
61 kommentarer og 1 løsning
Sorter bagefter istedet for Order by on the fly.
Jeg henter en top 10 ud af min database på denne måde. --------------- Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open strDSN strSQL = "SELECT top 10 count.site, Count(count.site) As taeler " & _ "FROM count GROUP BY count.site order by taeler desc" Set rs = myConn.Execute(strSQL) --------------- De kommer fint i række følge. Men mit problem ligger i at jeg vil tage gennemsnittet af antal tilmeldte dage. Og så er det jo ikke sikkert at række følgen er den samme længere.
Kan jeg på en måde hente alle ud og derefter sætte dem i række følge. Eller vil det tage for lang tid.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Jeg forstår ikke helt hvad du vil. Vil du tage gennemsnittet af alle poster, eller bare de ti største? Jeg tror det ville være nemmest at tage to recordset ud, men jeg er ikke sikker på jeg har forstået det.
Jeg vil tage gennemsinnet af alle poster men det er forskelligt hvor mange dage de har været tilmeldt.
Jeg vil tage gennemsnittet for de sidste 7 dage. Men det går galt hvis nu en side kun har været tilmeldt i 3 dage så skal det kun være gennemsnittet for 3 dage.
Sådan som jeg gør det får jeg de 10 største samlet ud .. det jeg skal bruge er de 10 største i gennemsnit. Ikke totalt.
Altså du har x antal sider, som har været oppe i n antal dage. Så vil du have dem grupperet efter side, og fundet gennemsnittet af et eller andet, og finde de ti af dem der har det største gennemsnit?
Denne sql finder alle gennemsnit, og summer fra de forskellige sites. Hvis det kun skal være for de sidste 7 dage, skal du vist have en dato med ind i billedet, det ved jeg ikke om du har. SELECT count.site, Avg(count.taeller) AS GennemsnitOftaeller, Sum(count.taeller) AS SumOftaeller FROM count GROUP BY count.site;
Det er et statistik system hvor der tælles antal af hits. Det vil sige der en post for hver hit.
Posterne kan se sådan ud:
ID 1020 - HIT 1 ID 1020 - HIT 1 ID 1020 - HIT 1 ID 1010 - HIT 1 ID 1020 - HIT 1 ID 1010 - HIT 1 ID 1020 - HIT 1
Jeg henter så i en anden database dato for tilmeldingen. Udfra den kan jeg så afgøre hvad HIT tallet skal deles med. Og på den måde får jeg så gennemsnit pr dag.
Du kan så smide denne her på for at sortere dem: ORDER BY Sum(count.taeller) DESC; Du skal vist skrive taeler de steder jeg har skrevet taeller, men ellers skulle det virke.
Hm, lidt mere indviklet. Det vil sige du har to tabeller, en med alle hits'ene, og en med datoen for tilmeldingerne? Så skal du vel til at lave en inner join på de to tabeller, og lave noget sum, og gennemsnit på resultatet
Du skal ikke have linieskift med inde. strSQL = "SELECT count.site, Avg(count.taeler) AS GennemsnitOftaeler, Sum(count.taeler) AS SumOftaeler FROM count GROUP BY count.site;"
Ok, jeg havde ikke læst din sql ordentlig, taeler er en du selv definerer. , Count(count.site) As taeler . Jeg er nød til at vide lidt mere om dine tabeller for at kunne hjælpe dig. Så vidt jeg har fostået, er der to tabeller, den ene indeholder noget ala ID 1020 - HIT 1 ID 1020 - HIT 1 ID 1020 - HIT 1 ID 1010 - HIT 1 ID 1020 - HIT 1 ID 1010 - HIT 1 ID 1020 - HIT 1 Den anden indeholder start datoer. Prøv at fortælle mig hvad de to tabeller hedder, og hvad kolonnerne i hver af dem hedder og indeholder.
Jeg har flere forskellige felter i databasen. Det er felter hvor der står inforamtioner om de forskellige brugere der har været inde på siderne.
Hver side har et id nr. eksempelvis 1020. Hver gang der kommer et jit kommer der så en ny record hvor feltet SITE bliver = id nr. 1020.
Det man skal gøre er vel at tælle antal SITE felter og derefter grupere dem. strSQL = "SELECT count.site, Count(count.site) As taeler " & _ "FROM count GROUP BY count.site order by taeler desc"
Der er et felt (reg) der ligeldes indeholder dato og tid for et hit. Det jeg har gjort for at hente kun 7 dage er sådan her.
strSQL = "SELECT count.site, Count(count.site) As taeler " & _ "FROM count where reg > GETDATE()-7 GROUP BY count.site order by taeler desc"
Spørgsmålet er om der findes sådan en gennemsnit funktion eller om jeg skal over lave det i et array og på den måde få den rette rækkefølge.
Du burde kunne lave det med sql, men jeg skal prøve mig frem med det, for at få det til at virke, jeg kan ikke lave det uden at have det i hånden. Om du laver det med et array, eller med et recordset, burde være ligegyldigt, du kan det samme med begge. Men igen, uden at se hvordan alle dataerne er sat sammen, er det svært for mig at hjælpe dig. Hvis du har lyst, kan du sende mig databasen på rasmus.bak.jepsen@teknologisk.dk, så kan jeg kigge på det.
Jep, jeg har fået den. Bare for at være helt sikre på at vi taler om det samme, så skal du: have fat i de ti sites der har haft den største daglige gennemsnit, målt over en uge. Normalt kan det findes ved at dele det samlede antal hits de sidste syv dage, med 7, men hvis en af sitesene ikke har været tilmeldt i en hel uge, skal tallet deles med det antal dage, de har været tilmeldt, ikkesandt?
Nu har jeg da fundet dem frem, men jeg har lidt bøvl med at ordne dem. Du kan lige få hvad jeg har indtil videre, så prøver jeg at få dem ordnet. sql = "SELECT Sum(count.site) AS SumOfsite, sites.tilmeld, count.site FROM count INNER JOIN sites ON count.site = sites.idnr WHERE (((count.reg)>Date()-7)) GROUP BY sites.tilmeld, count.site;" rst.Open sql, Conn, 3, 3 %> <table border="1" bordercolor="#000000" cellspacing="0" cellpadding="4"> <tr> <td>sum</td> <td>tilm</td> <td>site</td> <td>gnmsnt</td> </tr> <% Do while not rst.eof response.write "<tr>" response.write "<td>" & rst(0) & "</td>" response.write "<td>" & rst(1) & "</td>" response.write "<td>" & rst(2) & "</td>" if date() - 7 > rst(1) then c = Round(rst(0)/7, 0) else c = Round(rst(0)/(date() - rst(1)), 0) end if response.write "<td>" & c & "</td>" response.write "</tr>" rst.movenext loop %> </table>
strDSN = "DSN=SMS;uid=***;pwd=***;database=counter" Set Conn = Server.CreateObject("ADODB.Connection") sql = "SELECT Sum(count.site) AS SumOfsite, sites.tilmeld, count.site FROM count INNER JOIN sites ON count.site = sites.idnr WHERE (((count.reg)>Date()-7)) GROUP BY sites.tilmeld, count.site;" rst.Open sql, Conn, 3, 3
På samme måde som før. Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open strDSN strSQL = "SELECT Sum(count.site) AS SumOfsite, sites.tilmeld, count.site FROM count INNER JOIN sites ON count.site = sites.idnr WHERE (((count.reg)>Date()-7)) GROUP BY sites.tilmeld, count.site;" Set rs = myConn.Execute(strSQL)
strDSN = "DSN=SMS;uid=***;pwd=***;database=counter" Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open strDSN strSQL = "SELECT Sum(count.site) AS SumOfsite, sites.tilmeld, count.site FROM count INNER JOIN sites ON count.site = sites.idnr WHERE (((count.reg)>Date()-7)) GROUP BY sites.tilmeld, count.site;" Set rs = myConn.Execute(strSQL)
%> <table border="1" bordercolor="#000000" cellspacing="0" cellpadding="4"> <tr> <td>sum</td> <td>tilm</td> <td>site</td> <td>gnmsnt</td> </tr> <% Do while not rst.eof response.write "<tr>" response.write "<td>" & rs(0) & "</td>" response.write "<td>" & rs(1) & "</td>" response.write "<td>" & rs(2) & "</td>" if date() - 7 > rst(1) then c = Round(rs(0)/7, 0) else c = Round(rs(0)/(date() - rs(1)), 0) end if response.write "<td>" & c & "</td>" response.write "</tr>" rst.movenext loop %>
Har oprettet dig på servren .. så kan du teste direkte <% strDSN = "DSN=SMS;uid=Kaspers;pwd=test;database=counter" Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open strDSN strSQL = "SELECT Sum(count.site) AS SumOfsite, sites.tilmeld, count.site FROM count INNER JOIN sites ON count.site = sites.idnr WHERE (((count.reg)>Date()-7)) GROUP BY sites.tilmeld, count.site;"
Set rs = myConn.Execute(strSQL)
%> <table border="1" bordercolor="#000000" cellspacing="0" cellpadding="4"> <tr> <td>sum</td> <td>tilm</td> <td>site</td> <td>gnmsnt</td> </tr> <% Do while not rs.eof response.write "<tr>" response.write "<td>" & rs(0) & "</td>" response.write "<td>" & rs(1) & "</td>" response.write "<td>" & rs(2) & "</td>" if date() - 7 > rs(1) then c = Round(rs(0)/7, 0) else c = Round(rs(0)/(date() - rs(1)), 0) end if response.write "<td>" & c & "</td>" response.write "</tr>" rs.movenext loop %> </table>
Men det burde ikke have noget at skulle have sagt hvad slags server det er, hvis det er med sql-sætningen den er gal. Jeg vil skyde på at tabellen sites ligger et andet sted end tabellen count.
<% Set myConn = Server.CreateObject("ADODB.Connection") myconn.Open("Provider=SQLOLEDB; Data Source=213.237.39.75; Initial Catalog=counter; User ID=Kaspers; Password=test;") strSQL = "SELECT Sum(count.site) AS SumOfsite, sites.tilmeld, count.site FROM count INNER JOIN sites ON count.site = sites.idnr WHERE (((count.reg)>Date()-7)) GROUP BY sites.tilmeld, count.site;"
Set rs = myConn.Execute(strSQL)
%> <table border="1" bordercolor="#000000" cellspacing="0" cellpadding="4"> <tr> <td>sum</td> <td>tilm</td> <td>site</td> <td>gnmsnt</td> </tr> <% Do while not rs.eof response.write "<tr>" response.write "<td>" & rs(0) & "</td>" response.write "<td>" & rs(1) & "</td>" response.write "<td>" & rs(2) & "</td>" if date() - 7 > rs(1) then c = Round(rs(0)/7, 0) else c = Round(rs(0)/(date() - rs(1)), 0) end if response.write "<td>" & c & "</td>" response.write "</tr>" rs.movenext loop %> </table>
Jeg får denne fejl: Error Type: Microsoft OLE DB Provider for SQL Server (0x80004005) [DBNMPNTW]Specified SQL server not found. /eksperten/ny_side_1.asp, line 14
Set myConn = Server.CreateObject("ADODB.Connection") myconn.Open("Provider=SQLOLEDB; Data Source=213.237.39.75; Initial Catalog=counter; User ID=Kaspers; Password=test;") strSQL = "SELECT site, tilmeld FROM count INNER JOIN sites ON count.site = sites.idnr ORDER BY count.site"
Set rs = myConn.Execute(strSQL) site = "" c = 0 do while not rs.eof if rs(0) <> site then c = c + 1 end if rs.movenext loop rs.movefirst redim tabel(c,3) %> <% site = "" c = 0 do while not rs.eof if rs(0) <> site then tabel(c, 0) = rs(0) tabel(c, 2) = rs(1) c = c + 1 b = 0 end if b = b + 1 tabel(c-1,1) = b site = rs(0) rs.movenext loop for a = 0 to c if date() - tabel(a,2) > 7 then d = 7 else d = Round(date() - tabel(a,2),0) end if if d = 0 then d = 1 tabel(a,3) = tabel(a,1)/d next maxf = 100000 %> <table border=1 bordercolor=#000000 cellspacing=0 cellpadding=4> <% for b = 0 to c max = 0 maxn = 0 for a = 0 to c if tabel(a,3) > max and maxf > tabel(a,3) then max = tabel(a,3) maxn = a end if next response.write "<tr><td>" & tabel(maxn,0) & "</td><td>" & tabel(maxn,3) & "</td><td>" & tabel(maxn,1) & "</td></tr>" maxf = max next %> </table> </body> </html>
Det er når der er to sites der har det samme antal hits. Det tager min løkke ikke højde for. Så fortsætter den til den næststørste, og springer dem der er ens over. Det kan godt undgås, men så går det endnu langsommere. I virkelighen vil det ikke ske særlig ofte, men jeg kan da godt lave noget der tager højde for det. Det ville nu være nemmere med en server der kunne klare lidt flere sql forespørgsler. SUM og AVG osv.
Set myConn = Server.CreateObject("ADODB.Connection") myconn.Open("Provider=SQLOLEDB; Data Source=213.237.39.75; Initial Catalog=counter; User ID=Kaspers; Password=test;") strSQL = "SELECT site, tilmeld FROM count INNER JOIN sites ON count.site = sites.idnr ORDER BY count.site"
Set rs = myConn.Execute(strSQL) site = "" c = 0 do while not rs.eof if rs(0) <> site then c = c + 1 end if rs.movenext loop rs.movefirst redim tabel(c,3) %> <% site = "" c = 0 do while not rs.eof if rs(0) <> site then tabel(c, 0) = rs(0) tabel(c, 2) = rs(1) c = c + 1 b = 0 end if b = b + 1 tabel(c-1,1) = b site = rs(0) rs.movenext loop for a = 0 to c if date() - tabel(a,2) > 7 then d = 7 else d = Round(date() - tabel(a,2),0) end if if d = 0 then d = 1 tabel(a,3) = tabel(a,1)/d response.write d next maxf = 100000 ens = 0 %> <table border=1 bordercolor=#000000 cellspacing=0 cellpadding=4> <% for b = 0 to c - 1 max = 0 maxn = 0 for a = 0 to c if tabel(a,3) > max and maxf > tabel(a,3) then max = tabel(a,3) maxn = a end if if tabel(a,3) = maxf and maxfn <> a then ens = ens + 1 redim preserve nens(ens) nens(ens-1) = a end if next if ens > 0 then for e = 0 to ens-1 response.write "<tr><td>" & tabel(nens(e),0) & "</td><td>" & tabel(nens(e),3) & "</td><td>" & tabel(nens(e),1) & "</td><td>" & ens & "</td></tr>" b = b + 1 next end if response.write "<tr><td>" & tabel(maxn,0) & "</td><td>" & tabel(maxn,3) & "</td><td>" & tabel(maxn,1) & "</td><td>" & ens & "</td></tr>" ens = 0 redim nens(0) maxf = max maxfn = maxn next %> </table> </body> </html>
Jeg har fundet en løsning på paging systemet. Men nu opstår det mærkeligste problem. Når antal af dage er et ulige tal eksempelvis 3 dage så går det helt galt. Det ser totalt mærkeligt ud. Hvad dælen kan være årsagen hertil ??? (Alt virker perfekt når det tal jer deler med er et lige tal eksempelvis 4)
Her er en der virker, men den laver altså sorteringen client-side, i javascript. Jeg fik svip af at sidde og prøve at programmere min egen sorterings function, din server time'ede ud hele tiden. <html>
<head> <%
Set myConn = Server.CreateObject("ADODB.Connection") myconn.Open("Provider=SQLOLEDB; Data Source=213.237.39.75; Initial Catalog=counter; User ID=Kaspers; Password=test;") strSQL = "SELECT site, tilmeld FROM count INNER JOIN sites ON count.site = sites.idnr ORDER BY count.site"
Set rs = myConn.Execute(strSQL) site = "" c = 0 do while not rs.eof if rs(0) <> site then c = c + 1 end if rs.movenext loop rs.movefirst redim tabel(c,3) %> <% site = "" c = 0 do while not rs.eof if rs(0) <> site then tabel(c, 0) = rs(0) tabel(c, 2) = rs(1) c = c + 1 b = 0 end if b = b + 1 tabel(c-1,1) = b site = rs(0) rs.movenext loop for a = 0 to c if date() - tabel(a,2) > 7 then d = 7 else d = Round(date() - tabel(a,2),1) end if if d = 0 then d = 1 tabel(a,3) = tabel(a,1)/d next %> <script type="text/javascript"> listen = new Array(); <% for a = 0 to c-1 %> listen[listen.length] = new Array(<%=replace(tabel(a,3), ",", ".")%>,<%=replace(tabel(a,1), ",", ".")%>,'<%=replace(tabel(a,2), ",", ".")%>',<%=replace(tabel(a,0), ",", ".")%>); <% next %> function docompare(b,c){ return b[0] - c[0]; } function skriv(){ a = listen.sort(docompare).reverse(); str = "<table>"; for (i = 0; i < listen.length; i++){ str += "<tr><td>" + a[i][0] + "</td>"; str += "<td>" + a[i][1] + "</td>"; str += "<td>" + a[i][2] + "</td>"; str += "<td>" + a[i][3] + "</td></tr>"; } str += "</table>"; document.all.her.innerHTML = str; } </script> </head>
Det var det jeg prøvede før. Men din server understøtter ikke de funktioner, det var derfor jeg lavede det i javascript. Hvorfor virker det ikke i din asp side? Den jeg lavede her, har begge dele.
Det skal lige siges at det der tager tid er ikke javascript delen, men at hive al informationen ud af din server. Det kan du se ved at gemme den side der kommer frem lokalt, og så åbne den der, det går temmelig stærkt. Jeg ved ikke hvordan du havde tænkt dig at det skulle gå hurtigere end din server kan spytte tallene ud.
OK, jeg kunne få det til at gå en del hurtigere ved at tænke mig lift om. <html>
<head> <% Set myConn = Server.CreateObject("ADODB.Connection") myconn.Open("Provider=SQLOLEDB; Data Source=213.237.39.75; Initial Catalog=counter; User ID=Kaspers; Password=test;") strSQL = "SELECT count.site, Count(count.site) AS taeler, sites.tilmeld FROM sites INNER JOIN count ON sites.idnr = count.site GROUP BY count.site, sites.tilmeld;" Set rs = myConn.Execute(strSQL) %>
<script type="text/javascript"> listen = new Array(); <% do while not rs.eof if date() - rs(2) > 7 then tid = 7 else tid = date() - rs(2) end if if tid = 0 then tid = 1 if rs(0) <> "" and rs(1) <> "" and rs(2) <> "" then %> listen[listen.length] = new Array(<%=Round(rs(1)/tid, 0)%>,<%=rs(0)%>,'<%=rs(2)%>',<%=rs(1)%>); <% end if rs.movenext loop %> function docompare(b,c){ return b[0] - c[0]; } function skriv(){ a = listen.sort(docompare).reverse(); str = "<table>"; for (i = 0; i < listen.length; i++){ str += "<tr><td>" + a[i][0] + "</td>"; str += "<td>" + a[i][1] + "</td>"; str += "<td>" + a[i][2] + "</td>"; str += "<td>" + a[i][3] + "</td></tr>"; } str += "</table>"; document.all.her.innerHTML = str; } </script> </head>
<body onload="skriv()"> <div id="her"></div> </body> </html> Så får du det vist ikke bedre.
Jeg mener at de skal skrives i SELECT count.site, sites.titel, sites.beskrivelse, ... OG i GROUP BY count.site, sites.titel, sites.beskrivelse, ..., men prøv dig lidt frem´.
Set myConn = Server.CreateObject("ADODB.Connection") myconn.Open("Provider=SQLOLEDB; Data Source=213.237.39.75; Initial Catalog=counter; User ID=Kaspers; Password=test;") strSQL = "SELECT site, tilmeld FROM count INNER JOIN sites ON count.site = sites.idnr ORDER BY count.site"
Set rs = myConn.Execute(strSQL) site = "" c = 0 do while not rs.eof if rs(0) <> site then c = c + 1 end if rs.movenext loop rs.movefirst redim tabel(c,3) %> <% site = "" c = 0 do while not rs.eof if rs(0) <> site then tabel(c, 0) = rs(0) tabel(c, 2) = rs(1) c = c + 1 b = 0 end if b = b + 1 tabel(c-1,1) = b site = rs(0) rs.movenext loop for a = 0 to c if date() - tabel(a,2) > 7 then d = 7 else d = Round(date() - tabel(a,2),1) end if if d = 0 then d = 1 tabel(a,3) = tabel(a,1)/d next %> <script type="text/javascript"> side = 0; listen = new Array(); <% for a = 0 to c-1 %> listen[listen.length] = new Array(<%=replace(tabel(a,3), ",", ".")%>,<%=replace(tabel(a,1), ",", ".")%>,'<%=replace(tabel(a,2), ",", ".")%>',<%=replace(tabel(a,0), ",", ".")%>); <% next %> function docompare(b,c){ return b[0] - c[0]; } antalposterpaaside = 10; function skriv(n){ a = listen.sort(docompare).reverse(); side = n; if (side < 0) side = 0; fra = n * antalposterpaaside; til = (n+1) * antalposterpaaside; if (til > listen.length) til = listen.length; if (fra < 0) fra = 0; if (fra > listen.length - antalposterpaaside) fra = listen.length - antalposterpaaside; str = "<table>"; alert(fra + " " + til); for (i = fra; i < til; i++){ str += "<tr><td>" + a[i][0] + "</td>"; str += "<td>" + a[i][1] + "</td>"; str += "<td>" + a[i][2] + "</td>"; str += "<td>" + a[i][3] + "</td></tr>"; } str += "</table>"; document.all.her.innerHTML = str; } </script> </head>
<body onload="skriv(side)"> <div id="her"></div> <input type="button" value="<<Forrige" onclick="skriv(1*side - 1)"> <input type="button" value="Næste>>" onclick="skriv(1*side + 1)"> </body> </html> Du skal ændre i antalposterpaaside for at angive hvor mange poster pr side der skal være.
...og slette linien alert(fra + " " + til); den var bare til at tjekke med.
Synes godt om
Ny brugerNybegynder
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.