17. september 2003 - 12:21Der er
53 kommentarer og 3 løsninger
udregningen virker ikke helt
hej .. jeg har fået lavet denne kode som skal finde det billigste produkt eller hvis prisen er den samme skrive det, den henter fra to tabeller tabel1 og tabel2. Hvis produktet ikke findes i den ene tabel skal den stadig vise det, som det billigst.. men det gør denne her ikke.. den kører fint igennem men det regner ikke rigtigt og viser heller ikke alle produkter.:
hjælp hvis I kan
<%
SQL = "SELECT tabel1.levnavn AS navn1, tabel2.levnavn AS navn2, tabel1.pris AS pris1, tabel2.pris AS pris2, tabel1.DescShort AS b, tabel1.varenummer FROM tabel1 INNER JOIN tabel2 ON tabel1.varenummer=tabel2.varenummer where tabel1.varenummer" Set rs=conn.execute(SQL)
Do while not (rs.BOF or rs.EOF) if (rs("pris1")<rs("pris2")) then pris = rs("pris1") navn = rs("navn1") end if if (rs("pris2")<rs("pris1")) then pris = rs("pris2") navn = rs("navn2") end if if (rs("pris1")=rs("pris2")) then fejl = 1 pris = rs("pris1") navn = rs("navn1") &" og "& rs("navn2") end if response.write("Varen: "& rs("varenummer") & rs("b") &"") if (fejl) then response.write("sælges til samme pris ("& pris &") hos "& navn &"<br>") else response.write("sælges billigst ("& pris &") hos "& navn &"<br>" ) end if rs.movenext loop
Problemmet ligger som jeg ser i at det er en join. Det skulle i min verden være en UNION og så lave en SQL som denne hvor den med GROUP BY finde den mindste pris..
SELECT * FROM spm401625 AS T1, (SELECT min(T2.pris) as mpris, T2.varenummer FROM spm401625 AS T2 GROUP BY T2.varenummer) AS [T3] WHERE T1.pris = mpris;
Jeg har ikke tid til at vise et bedre eksemple før i aften.
SQL = "SELECT tabel1.levnavn AS navn1, tabel2.levnavn AS navn2, tabel1.pris AS pris1, tabel2.pris AS pris2, tabel1.DescShort AS b, tabel1.varenummer FROM tabel1 LEFT JOIN tabel2 ON tabel1.varenummer=tabel2.varenummer where tabel1.varenummer"
ok.. der er to leverandøre og deres priser og produkter ligger i hver deres tabel. de har begge en saab 9000 med varenummer "9000" tabel1 = lev1 har pris 5000 og tabel2 = lev2 har pris 5100 så skal den sammelinge på varenummere og sig ok det er den samme vare derefter sammelinger jeg priserne og så skal jeg skrive hvem der er billigt.. hvis de har den samme pris vises begge levnavne..
håber du fårstå det er for hurtigt at se hvem der er billigt..
Prøv at bytte lidt rundt på rækkefølgen, og så brug ELSE: if (rs("pris1")=rs("pris2")) then fejl = 1 pris = rs("pris1") navn = rs("navn1") &" og "& rs("navn2") else if (rs("pris1")<rs("pris2")) then pris = rs("pris1") navn = rs("navn1") else pris = rs("pris2") navn = rs("navn2") end if end if
Har før set at det bare var rækkefølgen der var forkert...
Men er ikke sikker på at det er det der er problemet her, bare er forslag...
SQL = "SELECT tabel1.levnavn AS navn1, tabel2.levnavn AS navn2, tabel1.pris AS pris1, tabel2.pris AS pris2, tabel1.DescShort AS b, tabel1.varenummer FROM tabel1 inner JOIN tabel2 ON tabel1.varenummer=tabel2.varenummer where tabel1.varenummer" Set rs=conn.execute(SQL)
Do while not (rs.BOF or rs.EOF) if (rs("pris1")<rs("pris2")) then pris = rs("pris1") navn = rs("navn1") end if if (rs("pris2")<rs("pris1")) then pris = rs("pris2") navn = rs("navn2") end if if (rs("pris1")=rs("pris2")) then fejl = 1 pris = rs("pris1") navn = rs("navn1") &" og "& rs("navn2") end if response.write("Varen: "& rs("varenummer") & rs("b") &"") if (fejl) then response.write("sælges til samme pris ("& pris &") hos "& navn &"<br>") else response.write("sælges billigst ("& pris &") hos "& navn &"<br>" ) end if fejl = 0 rs.movenext loop
%>
men den viser stadig ikke den vare der kun er en af...
altså hvis tabel1 har 3 varenummer og tabel2 har4 varenummer
SQL = "SELECT t1.levnavn, t1.pris, t1.varenummer " SQL = SQL & "FROM (SELECT levnavn, pris, varenummer FROM tabel1 UNION ALL SELECT levnavn, pris, varenummer FROM tabel2) as t1, " SQL = SQL & "(SELECT min(pris) as mpris, varenummer FROM (SELECT pris, varenummer FROM tabel1 UNION ALL SELECT pris, varenummer FROM tabel2) GROUP BY varenummer) as t2 " SQL = SQL & "WHERE t1.pris = t2.mpris AND t1.varenummer = t2.varenummer;"
------------ Som test kan du prøve dette, du forudsætte du har to tabeller, tabel1 og tabel2 så skal du ikke rette i noget kun lave en connection til din database:
SQL = "SELECT t1.levnavn, t1.pris, t1.varenummer " SQL = SQL & "FROM (SELECT levnavn, pris, varenummer FROM tabel1 UNION ALL SELECT levnavn, pris, varenummer FROM tabel2) as t1, " SQL = SQL & "(SELECT min(pris) as mpris, varenummer FROM (SELECT pris, varenummer FROM tabel1 UNION ALL SELECT pris, varenummer FROM tabel2) GROUP BY varenummer) as t2 " SQL = SQL & "WHERE t1.pris = t2.mpris AND t1.varenummer = t2.varenummer;"
Set rs = Conn.Execute(SQL)
Response.Write "<table>" if not rs.EOF then Response.Write "<tr>" for each f in rs.Fields Response.Write "<td>" & f.name & "</td>" next Response.Write "</tr>" end if Response.Write "<tr><td>" Response.Write rs.GetString (, -1, "</tr><td>", "</td></tr><tr><td>", NBSPACE) response.write "</table>"
og så er der en lille en, hvis der er to vare der har den samme pris viser den varene to gange der skal den kun vise den engang og vælge levnavn fra tabel1.
Jeg ved ikke helt hvordan man kun får den med som er i tabel1 hvis der er flere med samme pris.
dui kan tilføje flere tabeller ved at tilføje denne til den første UNION ALL liste som hedder t1 UNION ALL SELECT levnavn, pris, varenummer, DescShort FROM tabel3
Samt denne ved den anden UION ALL lige før ) GROUP BY varenummer UNION ALL SELECT pris, varenummer FROM tabel3
Så den ser sådan her ud:
SQL = "SELECT t1.levnavn, t1.pris, t1.varenummer, t1.DescShort " SQL = SQL & "FROM (SELECT levnavn, pris, varenummer, DescShort FROM tabel1 UNION ALL SELECT levnavn, pris, varenummer, DescShort FROM tabel2 UNION ALL SELECT levnavn, pris, varenummer, DescShort FROM tabel3) as t1, " SQL = SQL & "(SELECT min(pris) as mpris, varenummer FROM (SELECT pris, varenummer FROM tabel1 UNION ALL SELECT pris, varenummer FROM tabel2 UNION ALL SELECT pris, varenummer FROM tabel3) GROUP BY varenummer) as t2 " SQL = SQL & "WHERE t1.pris = t2.mpris AND t1.varenummer = t2.varenummer;"
Det kan jeg ikke helt finde ud af, har du mulighed for at hjælpe sådan se det ud nu ... nu har jeg tre tabeller med :-) jeg har ikke rigtig nogen formular ?
<% SQL = "SELECT t1.varenummer, t1.DescShort, t1.pris, t1.levnavn " SQL = SQL & "FROM (SELECT levnavn, pris, varenummer, DescShort FROM tabel1 " SQL = SQL & "UNION ALL SELECT levnavn, pris, varenummer, DescShort FROM tabel2 " SQL = SQL & "UNION ALL SELECT levnavn, pris, varenummer, DescShort FROM tabel3) " SQL = SQL & "as t1, " SQL = SQL & "(SELECT min(pris) as mpris, varenummer " SQL = SQL & "FROM (SELECT pris, varenummer FROM tabel1 " SQL = SQL & "UNION ALL SELECT pris, varenummer FROM tabel2 " SQL = SQL & "UNION ALL SELECT pris, varenummer FROM tabel3 " SQL = SQL & ") GROUP BY varenummer) as t2 " SQL = SQL & "WHERE t1.pris = t2.mpris AND t1.varenummer = t2.varenummer;"
Set rs = Conn.Execute(SQL)
Response.Write "<table>" if not rs.EOF then Response.Write "<tr>" for each f in rs.Fields Response.Write "<td>" & f.name & "</td>" next Response.Write "</tr>" end if Response.Write "<tr><td>" Response.Write rs.GetString (, -1, "</tr><td>", "</td></tr><tr><td>", NBSPACE) response.write "</table>" %>
Ja ok, men det kræver noget kode som udskriver recordsetet og tjekke hver vare om der er flere vare med samme varenummer. Og ikke det som jeg har vist som udskriver hele recordetet på en gang.
YES.. nu virker det bare godt... kan man ligge 25 % på vores billigste pris også sammenlinge resultaterne med en fjerde tabel4, og sige hvis vores pris er billigere < end prisen i tabel4 indsæt resultatet i tabel5. hvis ikke + 30% i stedet.
håber du forstår...
hvis ikke noget af det kan lade sig gøre, så kunne jeg godt tænke mig den sagde vores billigste resultat + 25% indsættes i tabel5
Beklager jeg ikke har svaret før nu, men jeg har være væk de sidste par dage..
Dér ligger en masse udregninger som jeg lige ser det, problemmet er der hele tiden komme lige en ting mere og så lige en ting mere på. Løsningen er afhængig af problemmet og ændre problemmet sig ændre løsningen sig.
Det kan være du skal for hvert varenummer trække en post ud af tabel4 og sammenligen pris med det varenummer man er kommet til inden man udsjkriver det, du kan ligge 25% ved at gange med 1.25 og ligge 30% til ved at gange med 1.3
Du behøver ikke at oprette et nyt spg. for at tildele flere point...
Oppe i øverste venstre hjørne af dit "start-spg." står der hvor mange point du udlodder til den der gi'r et acceptabelt svar. Ved at trykke på det lille flag til venstre for pointene, kan du ændre hvor mange point du vil gi' væk...
super jeg har fikset det laver bare to sider en til at vise og en der inserter i tabel4. og så kunne jeg så godt tænke mig at den lige lagde 25% oven i det resultat den skrev ind i tabel4 så det der stod der var den bedste pris + 25 % hvordan er det lige du siger jeg kan sætte det ind i denne kode ?
<% SQL = "INSERT INTO tabel4 (levnavn, pris, varenummer, DescShort) SELECT t1.levnavn, t1.pris, t1.varenummer, t1.DescShort " SQL = SQL & "FROM (SELECT levnavn, pris, varenummer, DescShort FROM tabel1 " SQL = SQL & "UNION ALL SELECT levnavn, pris, varenummer, DescShort FROM tabel2 " SQL = SQL & "UNION ALL SELECT levnavn, pris, varenummer, DescShort FROM tabel3) " SQL = SQL & "as t1, " SQL = SQL & "(SELECT min(pris) as mpris, varenummer " SQL = SQL & "FROM (SELECT pris, varenummer FROM tabel1 " SQL = SQL & "UNION ALL SELECT pris, varenummer FROM tabel2 " SQL = SQL & "UNION ALL SELECT pris, varenummer FROM tabel3 " SQL = SQL & ") GROUP BY varenummer) as t2 " SQL = SQL & "WHERE t1.pris = t2.mpris AND t1.varenummer = t2.varenummer ORDER BY t1.varenummer;"
Set rs = Conn.Execute(SQL)
%>
så er jeg snart en glad mand og jeg har sat alle mine point på det... :-)
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.