webForumDet fria alternativet

SQL sats i loop?

10 svar · 813 visningar · startad av golgata

golgataMedlem sedan maj 2000131 inlägg
#1

Lite fortsättning på förra tråden men med ny fråga.

Har följande kod för att lista alla amnen som finns inlagda för ett ett id.

<%
SQL = "Select Distinct amne FROM amne WHERE id = " & CInt(Request.QueryString("Id")) &" ORDER BY amne"
Set RecSet = Connect.execute(SQL)
%>

<% Do Until recset.EOF %>

<%= recset("amne")%>
<%
Recset.MoveNext
loop
recset.close
%>

Nu vill jag lägga in en SQL sats i loopen för att räkna ut totalsumman för ett ämne.
Sen loopa nästa ämne och räkna ut totalsumman för det ämnet osv.

Sen ska allt presenteras som
Ämna
Totalsumma

nästa ämne
totalsumma
osv

SQL satsen som jag vill ha in ser ut så här.

SQL = "select amne, niva, id, amnesid, sum(niva) as totaltniva1 from amne Where id = " & CInt(Request.QueryString("Id")) &" AND niva = 1 group by id, amnesid, niva"
Set Rs1 = Connect.Execute(SQL)

Det jag skulle vilja ha in är WHERE amne = recset("amne") efter id = " & CInt(Request.QueryString("Id")) &" AND niva = 1
men det vill inte fungera.

Hoppas att någon fattar vad jag är ute efter.

För att förtydliga det ytterliggare så lägger jag upp 2 bilder.
En hur databasen och en för hur resultatet ska visas.
databasvärden = http://www.sommarmat.se/databas.jpg
visa resultat = http://www.sommarmat.se/resultat.jpg

voigtann1Medlem sedan juni 20019 519 inlägg
#2

Jag hänger inte med riktigt...

SQL = "select amne, niva, id, amnesid, sum(niva) as totaltniva1 from amne Where id = " & CInt(Request.QueryString("Id")) &" AND niva = 1 group by id, amnesid, niva"

Är väl den du skall använda till ditt RecSet?
Och när du loopar ut det så ser det ut något liknande:

<%
dim sCurrentTopic
SQL = "select amne, niva, id, amnesid, sum(niva) as totaltniva1 from amne Where id = " & CInt(Request.QueryString("Id")) &" AND niva = 1 group by id, amnesid, niva"
Set RecSet = Connect.execute(SQL)

If Not RecSet.EOF Then

	Do Until recset.EOF

		If sCurrentTopic <> recset("amne") Then
			Response.Write "<h1>" & RecSet("amne") & "</h1>"
		End If

		Response.Write RecSet("niva") & " - " & RecSet("totaltniva1") & "<br />"

		sCurrentTopic = recset("amne")
		RecSet.MoveNext
	Loop

End If
recset.close
%>

Kan vara helt ute och cyckla här ...

golgataMedlem sedan maj 2000131 inlägg
#3

ser riktigt bra ut.

för att krångla till det lite så vill jag även att det ska räknas ihop hur många nivå 1 det finns för varje ämne.
likadant hur många nivå 2 det finns för varje ämne
och nivå 3 likadant

detta ska skrivas ut ungefär så här.
Response.Write RecSet("niva") & " - " & RecSet("totaltniva1") & " = antal " & RecSet("AntalPerNiva") & " <br /> "

voigtann1Medlem sedan juni 20019 519 inlägg
#4

Osäker här men:

Count(amne) as AntalPerNiva

tror inte det fungera, och det heter inte Count i mySQL heller :/

golgataMedlem sedan maj 2000131 inlägg
#5

Kanon.
Hade lagt det som AND Count(amne) as AntalPerNiva. det skulle vara ,Count(amne) as AntalPerNiva

golgataMedlem sedan maj 2000131 inlägg
#6

Använder koden nedan
I kolumnen poäng så finns värdena 0 till 3. Om jag vill räkna ut totalsumman för alla där det är 1. och totalsumman för 2 och totalsummar för 3.
enkelt översatt men den koden fungerar inte.
alt. att räkna hur många fält som finns med en 1:a och sen gånga med 1, antal fält med 2:a och gånga med 2 och antal fält med 3 och gånga med 3.

se fet stil

SQL = "select amne, niva, id, amnesid, idniva, sum(poang) as totaltvarde, sum(poang) where poang = 1 as totaltvarde1, sum(poang) where poang = 2 as totaltvarde2, sum(poang) where poang = 3 as totaltvarde3 Count(amne) as AntalPerNiva from "amne Whereid = " & CInt(Request.QueryString("Id")) &" group by id, amnesid, niva"
Set RecSet = Connect.execute(SQL)

<%
dim sCurrentTopic, maxniva
SQL = "select amne, niva, id, amnesid, idniva, sum(poang) as totaltvarde, Count(amne) as AntalPerNiva from "amne Whereid = " & CInt(Request.QueryString("Id")) &" group by id, amnesid, niva"
Set RecSet = Connect.execute(SQL)

If Not RecSet.EOF Then

	Do Until recset.EOF

		If sCurrentTopic <> recset("amne") Then
			Response.Write "<p class='titel'>" & RecSet("amne") & "</p>"
		End If
		
maxniva = (CInt(recset("antalperniva")) * 3)
snitt = (Cint(recset("totaltvarde")) / maxniva)
linje = (snitt * 450)
		Response.Write "<table cellspacing='0' cellpadding='0'><tr><td width'100'>Nivå " & RecSet("niva") & "</td><td style='border: 1px solid #000000; padding: 1px' width='450'><img border='0' height='15' src='../bilder/mallinje.gif' width="& linje &"></td></tr></table> <br />"
		sCurrentTopic = recset("amne")

		RecSet.MoveNext
	Loop

End If
recset.close
%>
voigtann1Medlem sedan juni 20019 519 inlägg
#7

Använd istället ASP... annars kommer du få samma resultat och generera mer fält i ditt recordset än vad du behöver.
lägg till fältet poang ska hämtas ut i din SQL (helt vanligt)

Do until Recset.EOF
...
..
SELECT CASE RecSet("poang")
  Case 0
    lSum0 = lSum0 + RecSet("poang")
  Case 1
    lSum1 = lSum1 + RecSet("poang")
  Case 2
    lSum2 = lSum2 + RecSet("poang")
  Case 3
    lSum3 = lSum3 + RecSet("poang")
End Select

Och efter Loop så kan du skriva ut lSumX för att få reda på summan

golgataMedlem sedan maj 2000131 inlägg
#8

de fungerade inte som jag tänkt mig.

säg att för ämnesid 1 och nivå 1 så finns det 5 st fält som har värdet 1 i poängfältet då för det ämnet ska det visas 5
ämnesid 1 och nivå 1 så finns det 3 st fält som har värdet 2 i poängfältet då för det ämnet ska det visas 3
ämnesid 1 och nivå 2 så finns det 4 st fält som har värdet 1 i poängfältet då för det ämnet ska det visas 4
osv

emissionMedlem sedan dec. 19996 721 inlägg
#9

I princip är det mycket enkelt och effektivt att ta ut denna data direkt i SQL-frågan. Huruvida det funkar för dig återstår att se.

SQL = "select amne, niva, id, amnesid, idniva, sum(poang) as totaltvarde, sum(case when poang = 1 then poang else null end)  as totaltvarde1, sum(case when poang = 2 then poang else null end)  as totaltvarde2, sum(case when poang = 3 then poang else null end)  as totaltvarde3 Count(amne) as AntalPerNiva from amne Where id = " & CInt(Request.QueryString("Id")) &" group by amne, niva, id, amnesid, idniva"
golgataMedlem sedan maj 2000131 inlägg
#10

emission ditt förslag fungerar men problemet är då att när allt skrivs ut så visas det en ny rad om ett ämne och en nivå innehåller flera olika poäng

raden nedan skriv ut 1 gång/värde
[code]
Response.Write "<table cellspacing='0' cellpadding='0'><tr><td width'100'>Nivå " & RecSet("niva") & "</td><td style='border: 1px solid #000000; padding: 1px' width='450'><img border='0' height='15' src='../bilder/mallinje.gif' width="& linje &"></td></tr></table> <br />"
[/code9]

golgataMedlem sedan maj 2000131 inlägg
#11

hittade felet. hade lagt till en text till i group by.

140 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)