Avatar billede lund_dk Praktikant
10. november 2005 - 13:54 Der er 33 kommentarer og
1 løsning

Tælle sum

Jeg har en tabel i min database der eks ser sådan her ud

*tabel1*
ID    VAREID  SESSIONID
1    23      123456
2    34      123456
3    56      123456
4    43      123456

og en der ser sådan her ud

*tabel2*
ID    PRIS
23    2,00
34    4,00
23    6,00
56    8,00
78  10,00

Kunsten er at jeg først og fremmest skal via et database udtræk fra tabel1 for at finde poster ud fra en session ID

derefter skal jeg så have de varenumre der er i tabel1,kædet sammen med tabel2 så jeg via de vareID i tabel 1, kan hente priserne fra tabel2 og så lave sum, hvis i forstår,

hvordan gør jeg det ?
Avatar billede dr_chaos Nybegynder
10. november 2005 - 13:58 #1
noget i denne stil ?
SELECT SUM(PRIS) FROM tabel1 INNER JOIN tabel2 ON tabel2.VAREID =tabel1.ID GROUP BY (tabel2.VAREID)
Avatar billede softspot Forsker
10. november 2005 - 15:24 #2
dr_chaos >> det vil da give en fejl, da vareid ikke er et af de felter der bliver "selected"...(?)
Avatar billede softspot Forsker
10. november 2005 - 15:29 #3
...men på den anden side... hmmm... umiddelbart ville jeg tro at man skulle vælge vareid (godt nok fra tabel1) og gruppere som dr_chaos har vist

SELECT SUM(tabel2.PRIS), tabel1.VAREID FROM tabel1 INNER JOIN tabel2 ON tabel1.VAREID =tabel2.ID GROUP BY (tabel1.VAREID) WHERE SESSIONID = hvad_den_nu_skal_være
Avatar billede softspot Forsker
10. november 2005 - 15:30 #4
...faktisk skal der nok vendes rundt på group by og where

SELECT SUM(tabel2.PRIS), tabel1.VAREID
FROM tabel1 INNER JOIN tabel2 ON tabel1.VAREID = tabel2.ID
WHERE SESSIONID = hvad_den_nu_skal_være
GROUP BY (tabel1.VAREID)
Avatar billede dr_chaos Nybegynder
10. november 2005 - 16:53 #5
sandt nok men jeg gav bare et simpelt eksempel at gå ud fra :)
Avatar billede lund_dk Praktikant
10. november 2005 - 20:17 #6
Det der rigtig nok ud, hvordan kalder jeg så summen frem?
Avatar billede lund_dk Praktikant
10. november 2005 - 20:28 #7
set rsSum= Conn.Execute("SELECT SUM(varedetalje.PRIS), KurvLinier.varedetaljeid AS antal FROM kurvlinier INNER JOIN varedetalje ON kurvlinier.VAREID = varedetalje.ID WHERE SESSIONID = '" & session.sessionID & "' GROUP BY (kurvlinier.VaredetaljeID)")

Korrekt?
Problemet er bare at den regner forkert, umiddelbart her, der udskriver det første vareID, og ikke selve summen.
Avatar billede dr_chaos Nybegynder
10. november 2005 - 20:59 #8
set rsSum= Conn.Execute("SELECT SUM(varedetalje.PRIS) AS antal FROM kurvlinier INNER JOIN varedetalje ON kurvlinier.VAREID = varedetalje.ID WHERE SESSIONID = '" & session.sessionID & "' GROUP BY (kurvlinier.VaredetaljeID)")
brug denne.
Avatar billede lund_dk Praktikant
10. november 2005 - 21:02 #9
Der er noget galt, den giver mig en sum på 139,00 kr uanset hvor mange varer der er lagt i kurven.
se http://shop.lund.dk , læg en vare i kurven, i kategorien trøjer, og se sum i toppen.
Avatar billede lund_dk Praktikant
10. november 2005 - 21:05 #10
de 139 kan komme fra en post i varedetaljer, den har prisen 139
Avatar billede lund_dk Praktikant
10. november 2005 - 21:13 #11
jep, den napper kun prisen i tabellen varedetaljer ID nr 3
hvordan kan det være?
Avatar billede softspot Forsker
10. november 2005 - 22:29 #12
Hvad så med denne:

set rsSum= Conn.Execute("SELECT SUM(varedetalje.PRIS) AS antal, kurvlinier.varedetaljeid FROM kurvlinier INNER JOIN varedetalje ON kurvlinier.VAREID = varedetalje.ID WHERE SESSIONID = '" & session.sessionID & "' GROUP BY (kurvlinier.VaredetaljeID)")
Avatar billede lund_dk Praktikant
11. november 2005 - 08:34 #13
Desværre ikke, er det samme :/
Avatar billede lund_dk Praktikant
11. november 2005 - 11:23 #14
Har prøvet at vende og dreje det, uden det korrekte resultat :(
Avatar billede lund_dk Praktikant
12. november 2005 - 17:42 #15
Der er ikke andre som har mod på at give et forslag med?
Avatar billede softspot Forsker
12. november 2005 - 18:03 #16
Kan du ikke prøve at komme med et udsnit af dine data, for der er et eller andet galt med det vi har set her eller den måde vi har opfattet sammenhænget mellem data på, for det burde fungere med den summering og gruppering som er foreslået hidtil...
Avatar billede lund_dk Praktikant
12. november 2005 - 18:14 #17
Det kan du tro, hele koden ser sådan her ud nu:

set rsSum= Conn.Execute("SELECT SUM(varedetalje.PRIS) AS antal, kurvlinier.varedetaljeid FROM kurvlinier INNER JOIN varedetalje ON kurvlinier.VAREID = varedetalje.ID WHERE SESSIONID = '" & session.sessionID & "' GROUP BY (kurvlinier.VaredetaljeID)")
sum = formatnumber(rssum("antal"))
text = "Der er vare(r) i kurven"
Set RSKurv=Nothing
end if

Screenshot af tabel KurvLinier:
http://shop.lund.dk/screen1.jpg
Screenshot af VareDetalje:
http://shop.lund.dk/screen2.jpg
Avatar billede softspot Forsker
12. november 2005 - 19:32 #18
Hvilket resultat får du egentlig med den SQL-sætning du har lige nu?

Jeg kan se der er risiko for lidt forvirring mellem det alias som summen får og navnet på en eksisterende kolonne i tabellen, nemlig "antal". Det kan godt være du skal ændre alias for summen til f.eks. kurvPris. I øvrigt er det vel prisen der skal ganges med antal for at finde den samlede pris for hele ordrelinien. Jeg kan så ikke helt gennemskue om der kan risikere at være flere linier i en given brugers varekurv som refererer til den samme vare...?

Desuden er sessionid ikke foranstillet tabelnavnet (det tror jeg dog ikke er en katastrofe, men gør det alligevel for en sikkerheds skyld).

Jeg har arbejdet lidt med SQL-sætningen herunder:

sql = "SELECT (varedetalje.PRIS * Antal) AS KurvPris, kurvlinier.varedetaljeid " & _
      "FROM kurvlinier INNER JOIN varedetalje ON kurvlinier.VareID = varedetalje.ID " & _
      "WHERE kurvelinier.SessionID = '" & session.sessionID & "'"
set rsSum = Conn.Execute(sql)
Avatar billede lund_dk Praktikant
12. november 2005 - 20:11 #19
her får jeg fejlen:
Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der var ventet 1.
/shop/Default.asp, line 271

set rsSum = Conn.Execute(sql) - er lnie 271
Avatar billede softspot Forsker
12. november 2005 - 21:06 #20
Jeg tror det er fordi jeg har skrevet kurvelinier.sessionid i stedet for kurvlinier.sessionid. Desuden skal join-betingelsen bruge VaredetaljeID i stedet for VareID, altså:

sql = "SELECT (VareDetalje.PRIS * KurvLinier.Antal) AS KurvPris, KurvLinier.VareDetaljeID " & _
      "FROM KurvLinier INNER JOIN VareDetalje ON KurvLinier.VareDetaljeID = VareDetalje.ID " & _
      "WHERE KurvLinier.SessionID = '" & session.sessionID & "'"
Avatar billede lund_dk Praktikant
12. november 2005 - 21:21 #21
oki, prøver jeg, men kan ikke lige gennemskue hvordan jeg trækker summen ud?

sum = rsSum("???")
Avatar billede softspot Forsker
12. november 2005 - 21:42 #22
sum = rsSum("KurvPris")

Du er opmærksom på at du kan risikere at få flere linier/rækker returneret, ikke?
Avatar billede lund_dk Praktikant
12. november 2005 - 21:50 #23
Lige nu bliver rsSum("kurvpris") den prisen for den vare der er lagt i kurven sidst.
Avatar billede softspot Forsker
12. november 2005 - 21:59 #24
Hvordan ser koden omkring aflæsningen af denne værdi ud (vis gerne kildekode helt fra definitionen af sql-sætningen til du er færdig med at bruge værdien)?
Avatar billede lund_dk Praktikant
12. november 2005 - 22:01 #25
Er ikke helt med på præcis hvad det er du mener.
Avatar billede softspot Forsker
12. november 2005 - 22:04 #26
Du viste i kommentaren fra 12/11-2005 18:14:16 en klump kode, det er bare det jeg gerne vil se igen. Jeg vil gerne sikre mig at vi ikke kæmper med spøgelser, så derfor vil jeg gerne se den kode du bruger til at hente de data du lige har fået returneret...
Avatar billede lund_dk Praktikant
12. november 2005 - 22:08 #27
Yes okay, den ser sådan her ud fra ende til anden :)
---------
Set rsKurv = Conn.Execute("select * from KurvLinier where SessionID = '" & Session.SessionID & "'")
if rsKurv.EOF then
text = "<i>Kurven er tom..</i>"
sum = "0,00"
else

sql = "SELECT (VareDetalje.PRIS * KurvLinier.Antal) AS KurvPris, KurvLinier.VareDetaljeID " & _
"FROM KurvLinier INNER JOIN VareDetalje ON KurvLinier.VareDetaljeID = VareDetalje.ID " & _
"WHERE KurvLinier.SessionID = '" & session.sessionID & "'"
set rsSum = Conn.Execute(sql)

sum = formatnumber(rsSum("KurvPris"))
text = "Der er vare(r) i kurven"
Set RSSum=Nothing
end if
Avatar billede softspot Forsker
12. november 2005 - 22:16 #28
Ok, at dømme udfra din kode, så tror jeg, at jeg har misforstået dit behov. Det ser ud til at du gerne vil have summen for alle varer til en given session og ikke prisen for hver varelinie... er det korrekt?

Hvis ja, så skal vi jo nok over i en lidt anden SQL-konstruktion:

sql = "SELECT (VareDetalje.PRIS * KurvLinier.Antal) AS KurvPris " & _
"FROM KurvLinier INNER JOIN VareDetalje ON KurvLinier.VareDetaljeID = VareDetalje.ID " & _
"WHERE KurvLinier.SessionID = '" & session.sessionID & "'"
Avatar billede lund_dk Praktikant
12. november 2005 - 22:24 #29
Så er det måske derfor i ikke taler samme sprog, hehe.

Det er korrekt, det jeg ønsker er en samlet sum af de varer der nu er lagt i KurvLinier, og ikke samlet pris for hver varelinie.

Har prøvet at sætte den kode ind du er kommet med nu, men er umiddelbart samme sum resultat der kommer ud.
Avatar billede lund_dk Praktikant
12. november 2005 - 22:27 #30
Så jeg skal vel bare gøre således

sql = "SELECT SUM(VareDetalje.PRIS * KurvLinier.Antal) AS KurvPris " & _
"FROM KurvLinier INNER JOIN VareDetalje ON KurvLinier.VareDetaljeID = VareDetalje.ID " & _
"WHERE KurvLinier.SessionID = '" & session.sessionID & "'"
?

Altså så SUM med i den, og det er ud til nu at det virker :)
Avatar billede lund_dk Praktikant
12. november 2005 - 22:29 #31
Du skal have tusinde tak for din indsats, hvis du lægger et svar så du kan få lidt point:)
Avatar billede softspot Forsker
12. november 2005 - 22:30 #32
OK, her kommer lige et bud mere (ellers er jeg sq nok nød til at lave en testdatabase som jeg kan forsøge mig med):

sql = "SELECT SUM(VareDetalje.PRIS * KurvLinier.Antal) AS KurvPris " & _
"FROM KurvLinier INNER JOIN VareDetalje ON KurvLinier.VareDetaljeID = VareDetalje.ID " & _
"WHERE KurvLinier.SessionID = '" & session.sessionID & "'"
Avatar billede softspot Forsker
12. november 2005 - 22:30 #33
Hov! Der var jeg vist for længe om at læse og tænke... :)
Avatar billede softspot Forsker
12. november 2005 - 22:42 #34
Tak for point :)
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
Kurser inden for grundlæggende programmering

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