Set RS = Conn.Execute("SELECT SUM(points) As vPoints FROM MinTabel WHERE ID = " & fRS("ID") & "")
vil vel kun give en række da du ikke grupperer efter nogen anden kolonne i tabellen. Hvis du derimod skrev:
Set RS = Conn.Execute("SELECT id, SUM(points) As vPoints FROM MinTabel GROUP BY ID")
ville du få det antal rækker som der er unikke id'er i tabellen. Så kunne du f.eks. udvide SQL-sætningen med funktionen MAX således:
Set RS = Conn.Execute("SELECT id, SUM(points) As vPoints, MAX(points) as mPoints FROM MinTabel GROUP BY ID")
hvilket (nok lidt overflødigt) burde give dig max-point i hver eneste række. Dette felt kunne du så bruge til at sammenligne i dit gennemløb af rækker, således at den række hvor vPoints = mPoints skal fremhæves...
softspot, det ser fornemt ud, og det er til at forstå. Men jeg er nok for træt til at kunne tænke klart; hvordan får jeg den højeste værdi udskrevet med fed skrift?
<% Set RS = Conn.Execute("SELECT id, SUM(points) As vPoints, MAX(points) as mPoints FROM MinTabel GROUP BY ID")>
<table> <% Do Until RS.EOF %> <tr> <td><% If ..... = ...... Then %><b><%=....?%></b><% Else %><%=....?%><% End If %></td> </tr> <% RS.MoveNext Loop %> </table>
<% Set RS = Conn.Execute("SELECT id, SUM(points) As vPoints, MAX(points) as mPoints FROM MinTabel GROUP BY ID")>
<table> <% Do Until RS.EOF %> <tr> <td><% If RS("vPoints") = RS("mPoints") Then %><b><%=RS("vPoints")%></b><% Else %><%=RS("vPoints")%><% End If %></td> </tr> <% RS.MoveNext Loop %> </table>
Jeg kan ikke få scriptet til at makke ret. Kan du se fejl i dette? Jeg kan godt se logikken i dit script, og i teorien burde dette virke:
Set bdRS = Conn.Execute("SELECT vMID, SUM(points) As vPoints, MAX(points) As mPoints FROM MinTabel WHERE vMID = " & RS("mID") & " GROUP BY vMID")
<td><% If bdRS("vPoints") = bdRS("mPoints") Then %><b><%=FormatNumber(bdRS("vPoints"),2)%></b><% Else %><%=FormatNumber(bdRS("vPoints"),2)%><% End If %></td>
Hmm... det kunne være man skulle tage max af summen i stedet for det højeste point (min fejl)... prøv dette:
Set bdRS = Conn.Execute("SELECT vMID, SUM(points) As vPoints, MAX(SUM(points)) As mPoints FROM MinTabel WHERE vMID = " & RS("mID") & " GROUP BY vMID")
<td><% If bdRS("vPoints") = bdRS("mPoints") Then %><b><%=FormatNumber(bdRS("vPoints"),2)%></b><% Else %><%=FormatNumber(bdRS("vPoints"),2)%><% End If %></td>
Næh - det er sq også noget ævl, for der skal arbejdes med to forskellige grupperinger og derfor kan man ikke udvælge dem med så simpel en select. MAX skal enten findes i en en subquery eller separat fra den summerende SQL-sætning. Umiddelbart er den separate løsning nok nemmest at implementere og gennemskue... :)
Noget i stil med dette:
'----------------------------------------------------------------------------------- ' Konstruér en SQL-sætning der finder alle pointsummen ' for et givent vMID. ' NB: DENNE SQL VIL KUN RESULTERE I ÉN RÆKKE! SKAL DEN DET?? '----------------------------------------------------------------------------------- sql = "SELECT vMID, SUM(points) As vPoints " & _ "FROM MinTabel " & _ "WHERE vMID = " & RS("mID") & " " & _ "GROUP BY vMID"
'----------------------------------------------------------------------------------- ' Konstruér SQL-sætningen til at finde den største pointsum ' ved at benytte den SQL-sætningen for summering som subquery... '----------------------------------------------------------------------------------- sqlMax = "SELECT MAX(vPoints) AS mPoints FROM (" & sql & ")"
'----------------------------------------------------------------------------------- ' Aflæs først max-værdien, da det blot er én værdi som kan ' gemmes i en variabel (i modsætning til '----------------------------------------------------------------------------------- set rs = Conn.Execute(sqlMax) if not rs.eof then maxval = rs("mPoints") end if rs.close set rs = nothing
'----------------------------------------------------------------------------------- ' Aflæs derefter summen af point for den givne vMID '----------------------------------------------------------------------------------- Set bdrs = Conn.Execute(sql) if not bdrs.eof then %> <td><% If bdrs("vPoints") = maxval Then %><b><%=FormatNumber(bdrs("vPoints"),2)%></b><% Else %><%=FormatNumber(bdrs("vPoints"),2)%><% End If %></td><% end if bdrs.close set bdrs = nothing
Jeg har tilladt mig at ombryde koden lidt (så den forhåbentlig bliver lidt mere læsbar). Desuden har jeg taget konsekvensen af at du (tilsyneladende) insisterer på at der kun skal hentes pointsum for et enkelt id (vMID). Det kommer til udtryk ved at jeg i stedet for at lave en løkke omkring bdrs, blot laver en forgrening (if-sætning) som kontrollerer at der er returneret data inden den aflæser recordsettet.
Det kan sagtens være det er meningen at du kun vil finde pointsummen for et id (jeg kender ikke konteksten hvori koden skal bruges), så derfor har jeg ændret koden så den passer til dette krav... Dog har jeg lidt svært ved at gennemskue meningen med at skulle finde MAX pointsum i et sæt på en pointsum...? :)
Det er relativt let at ændre koden så der findes pointsum for alle vMID'er, da du blot skal fjerne dit WHERE-udtryk i sql (den til summering). Men gør du det skal du så også ændre if-sætningen til en løkke igen... :)
Ok, jeg har flere forskellige kategorier, og indenfor hver kategori, er der recordsets, som hver især vægtes med værdier, eller points, om du vil. Det recordset, der har den højeste værdi, skal markeres med fed skrift, så man på en nem måde kan finde det recordset (kapitel). Håber det kastede lidt lys over land :)
Du har godt nok lavet en masse. Jeg vil gå igang med det med det samme. Foreløbigt 1000 tak :)
Men er en kategori så det du identificerer ved vMID? I Så fald hvad er hensigten med at filtrere på en enkelt kategori i din forspørgsel... er det et levn fra et tidligere forsøg på at løse problemstillingen, eller er der et andet formål...?
Ups, jeg tror jeg har lavet en bommert mht. vMID? :o[
Jeg har en tabel med nogle recordsets, som indeholder ID, overskift, tekst, point etc. (dette er ikke navnene på kolonnerne).
Hvert ID har fået en karakter af brugerne. Når disse værdier lægges sammen, giver det et eller andet resultat, og her er det, at jeg ønsker den højeste værdi markeret med fed skrift. <- Problemet
Der er så angivet en værdi X gange, og når man dividerer X op i det sammenlagte pointantal, finder man jo gennemsnittet. Men det er ikke her problemet er. Problemet består i at finde den højeste værdi, og markere den med fed tekst.
Du har to tabeller, hvor den ene indeholder emner der skal afstemmes om (tabel1) og den anden indeholder resultaterne af afstemningerne (tabel2).
Tabel2 indeholder en fremmednøgle, som peger på tabel1's primærnøgle. Der er et 1 til mange-forhold mellem tabel1 og tabel2.
Det jeg opfatter du vil (hvis vi lige koncentrerer os om resultatet af udtrækket fra databasen først), er at summere en kolonne (point) i tabel2 grupperet efter fremmednøglen til tabel1. Ydermere vil du finde den største af de summerede værdier. Er det korrekt?
Hvis ovenstående stemmer overens med dine intentioner, kan du så ikke prøve at vise det faktisk layout af de 2 relevante tabeller (altså tabelnavne, samt feltnavne på de relevante felter, dvs. primærnøgler, fremmednøgler, samt kolonner som skal bruges i summeringen og beregning af maximum-værdi). Dette er for at få konstrueret SQL-sætningen korrekt fra starten, så du ikke skal oversætte noget, men bare kan kopiere den herfra og køre den...
Ha ha! Ja, den har vist være undervejs et stykke tid :-)
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.