Avatar billede mema Nybegynder
24. januar 2005 - 15:49 Der er 18 kommentarer og
1 løsning

Problem med SQL-sætning (Access-FrontPage)

Hej,
Jeg bruger FrontPage2000 og Access2002(både dansk)for at lave et simpelt statistik-program. I FrontPage har jeg en formular med 2 felter: Reg_tid(tekstboks) og Farve(rullemenu).
I Access har jeg 2 tabeller:
1-Resultater: Id(Autonummerering), Reg_tid(som er registreringstid og har tekst-Format: \'yyyy-mm-dd\'), og Farve_ID(tal)
2-Farve: Farve_ID(tal) og Farve(tekst).
De 2 tabeller er relateret til hinanden (Farve_ID - Farve_ID). Alt fint. Men når jeg vil trække data ud af en forespørgsel (den hedder: Reg_tid) og vise totale antal af hver indtastede farve og dens procenttal i forhold til totale indtastninger i et bestemt tidsinterval (fra dato til dato) vha. FrontPage- database resultater(wizard) får jeg følgende fejl-meddelelse:
[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression...
I database resultater(Wizard) i step 2 af 5 under Brugerdefineret forespørgsel skriver jeg:
SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe
HAVING (((Resultater.Reg_tid) Between '::Reg_tid1::' And '::Reg_tid2::'));
Jeg har meget lidt kendskab til ASP og SQL, men bliver meget glad at få hjælp til mit problem...
Avatar billede kjulius Novice
24. januar 2005 - 18:41 #1
Det udtryk du bruger i HAVING burde flyttes op på WHERE niveau. HAVING bruges til at teste på resultatet af aggregate functions, altså SUM, AVG, COUNT osv.

Her ønsker du at begrænse det antal rows, som skal tælles. Så skal kriteriet placeres i WHERE delen.
Avatar billede mema Nybegynder
24. januar 2005 - 20:37 #2
Er min SQL-sætning ellers rigtigt? Og hvis det er tilfælde, så skal jeg bare skifte HAVING med WHERE? Hvor skal så WHERE-sætning placeres i koden?
Avatar billede kjulius Novice
25. januar 2005 - 01:42 #3
Ja, ellers synes jeg det ser rigtigt ud...

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
WHERE (((Resultater.Reg_tid) Between '::Reg_tid1::' And '::Reg_tid2::'))
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;

Dvs. den vil give dig antal rows pr. gruppe inden for det valgte tidsrum. Men hvis du ønsker en procentdel i forhold til det totale antal rows pr. gruppe, så skal du vist gå en lidt anden vej. F.eks.:

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0) AS AntalOfSelectedReg_tid, AntalOfSelectedReg_tid * 100 / AntalOfReg_tid AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;

(Igen: har ikke testet det, men det ser rigtigt ud .-))
Avatar billede mema Nybegynder
25. januar 2005 - 10:06 #4
Hej Kjulius,
Jeg har testet din kode i FrontPage database results Wizard. Den øverste kode UDEN procent beregning virker fint :-). Men den nederste virker desværre ikke. jeg får følgende fejlmeddelese, når jeg skriver den i Trin 2 af 5 i FrontPages database result wizard i "Brugerdefineret forespørgsel":

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'Sum(IIf((Resultater.Reg_tid >= '1' And Resultater.Reg_tid <= '2'), 1, 0) AS AntalOfSelectedReg_tid, AntalOfSelectedReg_tid * 100 / AntalOfReg_tid AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY '.
Source: Microsoft OLE DB Provider for ODBC Drivers
Number: -2147217900 (0x80040e14)

Dvs. jeg får ikke lov til at komme til Trin 3. Jeg bliver glad hvis jeg får dette problem også løst fordi at beregne procenttal er en del af min opgave. :-|
Avatar billede kjulius Novice
25. januar 2005 - 12:59 #5
Sorry, der manglede vist en slutparantes...

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) AS AntalOfSelectedReg_tid, AntalOfSelectedReg_tid * 100 / AntalOfReg_tid AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;
Avatar billede mema Nybegynder
25. januar 2005 - 13:33 #6
Tak for svaret og rettelse, men jeg får stadigvæk følgende fejl-meddelelse:
Fejl-meddelelse:

Database Results Error
Description: [Microsoft][ODBC Microsoft Access Driver] The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.
Number: -2147217900 (0x80040E14)
Source: Microsoft OLE DB Provider for ODBC Drivers

One or more form fields were empty. You should provide default values for all form fields that are used in the query.
Avatar billede mema Nybegynder
25. januar 2005 - 13:36 #7
Hej igen kjulius,
Jeg har glemt at skrive, at jeg kommer nu faktisk gennem til Trin 5 af DBRW. Men så får jeg den ovenstående fejl-meddelelse i browseren.
Avatar billede kjulius Novice
25. januar 2005 - 18:09 #8
Okay, skud fra hoften - ODBC tillader ikke reference til tidligere beregninger via feltnavn (sådan er standard SQL faktisk defineret). Derfor skal beregningen gentages i procentberegningen:

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) AS AntalOfSelectedReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) * 100 / Count(Resultater.Reg_tid) AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;
Avatar billede mema Nybegynder
25. januar 2005 - 20:56 #9
Desværre virker den stadigvæk ikke. Så... jeg tror at du har brugt måske meget tid for det. Tak for det. Men jeg prøver igen. Den nye fejl-meddelelse er:

Database Results Error
Description: [Microsoft][ODBC Microsoft Access Driver] The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.
Number: -2147217900 (0x80040E14)
Source: Microsoft OLE DB Provider for ODBC Drivers

One or more form fields were empty. You should provide default values for all form fields that are used in the query.
Avatar billede mema Nybegynder
25. januar 2005 - 21:23 #10
Hej igen,
Min sidst kommentar var forkert. Nu får jeg ingen fejl-meddelelse (det var fordi det var et <br> i koden og det var min fejl ved kopiering).
Men.. Nu viser resultaterne kun ikke de rigtige procettal. For eksampel når jeg vælger det hele tabellen (fra startdato til slutdato) får alle farvene 100 for procenttal. Efter begrænsning af tidsintervaler har jeg fået:

Eksampel:
Reg_tid1: 2005-01-01
Reg_tid2: 2005-08-01

I resultat-tabellen står:
Farbe_ID  Farbe  AntalOfReg_tid  AntalOfSelectedReg_tid  AntalOfReg_tidProcentt
--------  -----  --------------  ----------------------  ----------------------
1        Gul      5                4                    80
2        Grøn      2                1                    50
3        Blå      2                0                    0
99        Vælg      1                1                    100

Jeg synes det er bare en lille fodfejl ved beregningen, fordi procenttalen bliver ikke beregnet med hensyn til totale forekomster (i ovenstående eksampel = 10), men tager højde for hver post (række). Jeg skal se på det. I øjeblikket skal jeg væk fra computeren. Barnet græder. Men jeg ved ikke om jeg kan løse den eller har jeg brug for hjælp. Tak igen. Jeg skal sende punkter til dig og bliver glad at høre fra dig vedr. netop denne sidste fejl.
Avatar billede mema Nybegynder
25. januar 2005 - 21:36 #11
Det jeg mente, var at fx farve gul (4 stk.) skulle have et procenttal i forhold til total forekomster i denne periode. Dvs.: 4+1+0+1=6 dvs. (4 * 100 / 6) = 66,66%
Avatar billede mema Nybegynder
25. januar 2005 - 21:38 #12
Iøvrigt hvordan kan jeg acceptere dit svar?
Avatar billede kjulius Novice
26. januar 2005 - 01:46 #13
Du har fundet ud af det med at acceptere mit svar, ser jeg. Tak for pointene:-)

Okay, det synes som om jeg har misforstået det hele lidt. Jeg troede procentsatsen skulle beregnes ud fra, hvor stor en del af gruppens samlede registreringer, der faldt inden for det ønskede tidsrum.

Hmm... Det er lidt svært, faktisk. Men hvis du nu prøver med dette (er lige kommet hjem og er på vej i seng, så jeg har ikke helt ro i kroppen til at prøve det af lige nu), så skulle der vist være en chance:

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) AS AntalOfSelectedReg_tid, (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Farbe_ID = Resultater.Farbe_ID AND R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::') AS NumberOfRows, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) * 100 / (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Farbe_ID = Resultater.Farbe_ID AND R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::') AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;
Avatar billede kjulius Novice
26. januar 2005 - 02:45 #14
Åh nej, jeg har da vist gjort en fejl. Lå i sengen og ku' ikke falde i søvn, da jeg pludselig kunne se for mig, at SQL-sætningen var forkert. Jeg prøver igen:

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) AS AntalOfSelectedReg_tid, (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::') AS NumberOfRows, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) * 100 / (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::') AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;
Avatar billede mema Nybegynder
26. januar 2005 - 09:02 #15
Tusind tak. Det virker :-)
Avatar billede kjulius Novice
26. januar 2005 - 09:09 #16
Tak for meldingen. Det er en lettelse, for jeg var meget i trivl...

;-)
Avatar billede mema Nybegynder
26. januar 2005 - 09:40 #17
Jeg er også meget glad for din hjælp.
Til sidst: Findes der en måde at definere antal decimaler i procent-feltet. Det viser nemlig 16 decimaler. Det skulle gerne være kun 2 decimaler.

Eventuelt: kan jeg på et senere tidspunk, når jeg går i gang og implementerer den rigtige database med flere tabeller og mange felter vende tilbage og oprette nyt spørgsmål (hvis der er behov for det), sådan at du genkender mig og evtl. hjælper mig igen..  :-)
Avatar billede kjulius Novice
26. januar 2005 - 23:34 #18
Jo, det kan jo gøres på flere måder. En af måderne er i selve SQL'en:

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) AS AntalOfSelectedReg_tid, (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::') AS NumberOfRows, Int(Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) * 100 / (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::') * 100) / 100 AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;

altså, hvor procentsatsen ganges med 100, hvorefter decimaler droppes, for til sidst igen at blive ganget med 100. Alle decimaler ud over de 2 er nu smidt væk. Vær dog opmærksom på, at du måske stadig vil se tal med kun 1 decimal, hvis den 2. decimal er et 0.

En anden vej er at bruge en format funktion i SQL'en. Resultatet vil så være en character variabel, og ikke numerisk variabel. Men hvis du ikke skal arbejde videre med det, men kun vise det i en html tabel, er det sikkert værd at overveje:

SELECT Resultater.Farbe_ID, Farbe.Farbe, Count(Resultater.Reg_tid) AS AntalOfReg_tid, Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) AS AntalOfSelectedReg_tid, (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::') AS NumberOfRows, Format(Sum(IIf((Resultater.Reg_tid >= '::Reg_tid1::' And Resultater.Reg_tid <= '::Reg_tid2::'), 1, 0)) / (SELECT Count(R.Reg_tid) FROM Resultater AS R WHERE R.Reg_tid BETWEEN '::Reg_tid1::' AND '::Reg_tid2::'), "0.00%") AS AntalOfReg_tidProcenttal
FROM Farbe INNER JOIN Resultater ON Farbe.Farbe_ID = Resultater.Farbe_ID
GROUP BY Resultater.Farbe_ID, Farbe.Farbe;

En tredie vej er at bruge VbScripts FormatPercent funktion (den samme som brugtes i ovenstående SQL). Jeg går ud fra, at du bruger ASP (Active Server Pages).

Der hvor procentsatsen udskrives til din side kan du derfor vælge at skrive:

FormatPercent( AntalOfReg_tidProcenttal ), evt. FormatNumber( AntalOfReg_TidProcenttal  )

Vær opmærksom på, at hvis du vælger FormatPercent funktionen, skal du ændre SQL forespørgslen, så den ikke ganger med 100 inden den dividerer med det samlede antal (det tager FormatPercent funktionen sig selv af).

Jeg vil forsøge at fange dine spørgsmål herinde efterhånden som de kommer :-) Men der er jo mange vidende folk her på sitet, så mon ikke dine spørgsmål vil blive besvaret uanset om jeg får "lov" endnu en gang...
Avatar billede mema Nybegynder
27. januar 2005 - 10:20 #19
Mange tak en gang til.

Jeg har brugt den først kode og den virker korrekt, fordi den viser ikke noget procenttal, når den er på ,00.

Den anden kode virker også efter jeg har ændret på:
.... AND '::Reg_tid2::'), "0.00%") AS AntalOfReg_tidProcenttal.... TIL
.... AND '::Reg_tid2::'), '0.00%') AS AntalOfReg_tidProcenttal....

Den sidste med ASP. Jeg kan ikke kode i ASP og derfor har jeg brugt FrontPages Database Resultater Wizard for at trække data fra databasen. :-)))
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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