27. januar 2005 - 10:42Der er
11 kommentarer og 1 løsning
Øge hastighed - Rapportgenerering
Nogle af mine rapporter benytter beregnede felter, så som =Gennemsnit([Temperatur]), hvilket sløver genereringen af rapporten VOLDSOMT. Felterne som indeholder disse beregninger, er sat på rapportfoden. Jeg vil jo helst ændre rapportens Postkilde til en forespørgsel, men får en fejl, hvis jeg bare kobler feltet på forespørgslen: Du har forsøgt at køre en forespørgsel, der ikke medtager det angivne udtryk "Dato" som en del af en aggregatfunktion.
SQL: SELECT *, Avg([Temperatur]) AS Temp FROM [MinTabel];
Mine erfaringer herfra har jeg fra databaser benyttet i netværk, hvor jeg har kunnet opnå en betydelige performanceforbedring i rapport-øjemed ved at preberegne stort set alle data
Check, men hvordan? Med preberegne mener du vel, at i mit tilfælde ville du flytte beregningerne fra kontrollerne (tekstboksene) til formularens postkilde, som så ændres fra at være en tabel til en forespørgsel.
Hvis jeg f.eks. har et felt på min rapport som har postkilden =Gennemsnit([Temperatur]) og formularens postkilde er MinTabel
så vil jeg ændre dette til en forespørgsel, men denne giver en fejlmeddelelse: SELECT *, Avg([Temperatur]) AS Temp FROM [MinTabel];
"Du har forsøgt at køre en forespørgsel, der ikke medtager det angivne udtryk "Dato" som en del af en aggregatfunktion." Hvordan skal forespørgslen se ud?
Hvis jeg må tillade mig at komme med en kommentar til din SQL i indledende spørgsmål, så vil du aldrig kunne få den til at fungere som den står:
SELECT *, Avg([Temperatur]) AS Temp FROM [MinTabel];
Som du har skrevet den, så ønsker du alle felter i MinTabel retur + et felt med gennemsnit på Temperatur feltet. Det kan du ikke, for så snart du specificerer en aggregat funktion (SUM, AVG og lign.), så skal alle andre returnerede felter specificeres i en GROUP BY sætning.
Hvis du gør det (specificerer alle tabellens felter i GROUP BY), får du dog kun gennemsnittet af hver DISTINCT row (husk, at hvis du specificerer alle en tabels felter i GROUP BY, svarer det til at skrive DISTINCT, altså ingen dubletter). Du vil altså kun få gennemsnittet af dubletter, hvilket ikke giver mening.
Du er derfor nødt til enten at droppe kravet om, at få alle tabellens felter med tilbage:
SELECT Avg([Temperatur]) AS Temp FROM [MinTabel];
Eller gå den anden vej - lave en selvstændig select på gennemsnitsfeltet:
SELECT [MinTabel].*, (SELECT Avg([Temperatur]) FROM [MinTabel]) AS Temp FROM [MinTabel];
Temp feltet bliver altså nu beregnet i en helt selvstændig forespørgsel (i parantesen).
Synes godt om
Ny brugerNybegynder
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.