Avatar billede lund_dk Praktikant
03. september 2006 - 22:13 Der er 23 kommentarer og
1 løsning

Beregn forskel fra første record til sidste

Når jeg udskriver en masse records fra min database mellem en given dato, vil jeg gerne have forskellen mellem første og sidste record.. hvordan gør jeg det

Min kolonne i databasen er af tal.

eks. fra min DB

ID ... TAL
1      10
2      23
3      24
4      34
5      35

Så skal altså have udreget hvor meget forskel der er imellem 10 og 35.
Avatar billede pidgeot Nybegynder
03. september 2006 - 22:15 #1
Er det altid i stigende rækkefølge (dvs. det altid er forskellen mellem det mindste tal og det største)? Hvis det er kan du bare sige SELECT MAX(tal)-MIN(tal) AS diff FROM ...
Avatar billede nielle Nybegynder
03. september 2006 - 22:15 #2
Sådan:

SELECT Max(tal)-Min(tal) AS forskel FROM dinTabel
Avatar billede nielle Nybegynder
03. september 2006 - 22:16 #3
Ahh. pidgeot kom først. :^)

Jeg tror dog ikke at sorteringsrækkefølgen har nugen betydning. :^)
Avatar billede pidgeot Nybegynder
03. september 2006 - 22:18 #4
Han siger jo han skal have det beregnet fra første til sidste, ikke mindste til største - så man ved jo aldrig :)
Avatar billede nielle Nybegynder
03. september 2006 - 22:19 #5
Jo, det har den måske nok (nu hvor jeg nærlæser spørgsmålet:^). Men hvis den ellers er stigende, så burde SQL'en virke.
Avatar billede lund_dk Praktikant
03. september 2006 - 22:24 #6
Mit "problem" kan være at tallene nødvendigvis ikke er stigende eller faldende..
Så resultatet skal både kunne være negativt eller positivt.. men prøver mig lige frem
Avatar billede nielle Nybegynder
03. september 2006 - 22:26 #7
Bare lige for at være helt sikker:

Skal resultatet beregnes som "forskel mellem første og sidst post" eller som "forskel mellem største og mindste post"?
Avatar billede lund_dk Praktikant
03. september 2006 - 22:29 #8
Ja den faldt jeg også lige over..skal IKKE være mellem største og mindste post,men skal være mellem første og sidste post.
Avatar billede pidgeot Nybegynder
03. september 2006 - 22:30 #9
Tænkte det nok - det andet var næsten lidt for nemt, jo :)

En måde ville vel at splitte den lidt op:

SELECT MIN(id) AS first, MAX(id) AS last FROM...
SELECT Tal FROM WHERE ID=first OR ID=last ORDER BY ID ASC

...og så hive ud i ASP og foretage subtraktionen der.

Det er også muligt med en subselect, men PRÆCIST hvordan afhænger af dit databasesystem.
Avatar billede lund_dk Praktikant
03. september 2006 - 22:37 #10
Min database ser sådan her ud: www.lund.dk/databasemaal.gif

Jeg henter mine records ud, med datoen, altså en dato fra og dato til.

I det valgte dato-rum skal min forskel fra ældste til nyeste record så findes.
Avatar billede nielle Nybegynder
03. september 2006 - 22:41 #11
Hvis du prøver med denne SQL:

SELECT * FROM maal WHERE id=min(id) OR id=max(id) ORDER BY id ASC

- burde du får to rækker ud. Den første og den sidste. Selve udregningen af differencen skal laves i ASP-koden.
Avatar billede lund_dk Praktikant
03. september 2006 - 22:46 #12
Altså således?
Set rsBryst = Conn.Execute("SELECT * FROM maal WHERE bryst=min(bryst) OR bryst=max(bryst) ORDER BY id ASC")


Der får jeg fejlen:

Microsoft JET Database Engine fejl '80040e14'
En aggregatfunktion kan ikke bruges i WHERE-delsætningen (bryst=min(bryst) Or bryst=max(bryst)).
Avatar billede nielle Nybegynder
03. september 2006 - 22:52 #13
Lad os lige glemme fejlen et jeblik, og lad mig spørge:

Hvorfor ændrede du det fra:

... WHERE id=min(id) OR id=max(id) ...

- til:

... WHERE bryst=min(bryst) OR bryst=max(bryst)...

?
Avatar billede lund_dk Praktikant
03. september 2006 - 22:58 #14
Fordi det er kolonnen "bryst" jeg skal have forskellen,så skal jeg vel rette id til bryst?
Avatar billede pidgeot Nybegynder
03. september 2006 - 23:00 #15
Nej, for så får du jo netop forskellen på det største og det mindste tal.

Det du skal have er forskellen på den første og den sidste, og for at du kan gøre det, er det nødvendigt at du finder de ID numre der repræsenterer den første og sidste række.
Avatar billede nielle Nybegynder
03. september 2006 - 23:02 #16
Men det WHERE-led skulle jo netop sørge for at få den første post (det mindste id) og den sidste post (det største id) ud. Hvis det ellers havde virket, så ville det at bruge bryst i stedet for id have givet nogle andre poster.
Avatar billede pidgeot Nybegynder
03. september 2006 - 23:03 #17
Noget jeg undrer mig lidt over - præcis hvorfor skal du have forskellen på lige den første og den sidste? Det er generelt ikke noget man kan bruge til så meget...
Avatar billede nielle Nybegynder
03. september 2006 - 23:04 #18
Well, det virkede jo ikke, så lad os glemme alt om det med det samme.

Det lader til at det skal gøres af to SQL-sætninger:

SELECT TOP 1 * FROM maal ORDER BY id ASC

- som giver dig tallene for den første post, og:

SELECT TOP 1 * FROM maal ORDER BY id DESC

- som giver dig tallene for den sidste post.
Avatar billede lund_dk Praktikant
03. september 2006 - 23:07 #19
Jeg er ved at lave et slanke-site hvor man indtaster sine kropsmål.
Her laver jeg en liste med de forskellige kropsmål, og vil så gerne fortælle brugeren hvad forskellen var fra det første til det sidste.. Således brugeren kan se hvor mange cm han/hun har tabt siden første og sidste record.

Ok nielle..Så har sat den ind som du skrev den,og fejlen lyder:
Microsoft JET Database Engine fejl '80040e14'
En aggregatfunktion kan ikke bruges i WHERE-delsætningen (id=min(id) Or id=max(id)).

/ww/bruger_maal.asp, linje 120
Avatar billede lund_dk Praktikant
03. september 2006 - 23:08 #20
nielle: ok, ser nu sådan her ud:
Set rsBrystStart = Conn.Execute("SELECT TOP 1 * FROM maal ORDER BY id ASC")
Set rsBrystSlut = Conn.Execute("SELECT TOP 1 * FROM maal ORDER BY id ASC")
Avatar billede nielle Nybegynder
03. september 2006 - 23:11 #21
Og derefter er det bare:

<%
brystDiff = rsBrystSlut("bryst") - rsBrystStart("bryst");
taljeDiff = rsBrystSlut("talje") - rsBrystStart("talje");
hofteDiff = rsBrystSlut("hofte") - rsBrystStart("hofte");
' etc. etc.
%>

Bliver nødt til at smutte nu ... skal ikke have nogen point på denne her. G'nat. :^)
Avatar billede lund_dk Praktikant
03. september 2006 - 23:13 #22
mener
Set rsBrystSlut = Conn.Execute("SELECT TOP 1 * FROM maal ORDER BY id desc") selvf.
Avatar billede lund_dk Praktikant
03. september 2006 - 23:22 #23
yes..

Mit endelige resultat ser sådan her ud..

<%
Set rsStart = Conn.Execute("SELECT TOP 1 * FROM maal where dato >= #" & fraDatoFormated & "# and dato <= #" & tilDatoFormated & "# ORDER BY dato desc")
Set rsSlut = Conn.Execute("SELECT TOP 1 * FROM maal where dato >= #" & fraDatoFormated & "# and dato <= #" & tilDatoFormated & "# ORDER BY dato ASC")

bryst = formatnumber(rsStart("bryst")) - formatnumber(rsSlut("bryst"))
talje = formatnumber(rsStart("talje")) - formatnumber(rsSlut("talje"))
hofte = formatnumber(rsStart("hofte")) - formatnumber(rsSlut("hofte"))
overarm = formatnumber(rsStart("overarm")) - formatnumber(rsSlut("overarm"))
laar = formatnumber(rsStart("laar")) - formatnumber(rsSlut("laar"))
%>
                <tr style="background-color:#EFEFEF;">
                    <td>Tab</td>
                    <td align="right"><%=formatnumber(bryst,1)%> cm.</td>
                    <td align="right"><%=formatnumber(talje,1)%> cm.</td>
                    <td align="right"><%=formatnumber(hofte,1)%> cm.</td>
                    <td align="right"><%=formatnumber(overarm,1)%> cm.</td>
                    <td align="right"><%=formatnumber(laar,1)%> cm.</td>
                    <td align="right"></td>
                </tr>
                <tr>
                    <td colspan="7" style="height:10px;background-image: url(images/categ_bg_point.gif);background-repeat: repeat-x;background-position:0px 5px"><img src="images/spacer.gif" height="1"></td>
                </tr>
            </table>
<%
rsStart. close
set rsStart= Nothing
rsSlut. close
set rsSlut= Nothing

%>
Avatar billede lund_dk Praktikant
03. september 2006 - 23:22 #24
Tak for hjælpen
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