Jeg skal løbe posterne igennem og kunne dividere et ErnæringsID for et MadID med et andet ErnæringsID for samme MadID. Den skal derfor blot returnere et resultat for hver MadID.
F.eks. kunne være at den skulle dividere ErnæringsID 1 med ErnæringsID 4 og forespørgslen skulle returnere følgende:
MadID DivisionResultat 1 0,219 2 0,298 3 0,468
Jeg håber at det kan forstås, selvom det er tidlig morgen og min hjerne er gået lidt i selvsving efter at have prøvet at få bikset den SQL-sætning sammen.
Jeg er kommet til noget som må være en del af løsningen, men stadig er et stykke derfra:
SELECT (SELECT Værdi FROM Næringsstoffer WHERE MadID = 1 AND ErnæringsID = 3) / (SELECT Værdi FROM Næringsstoffer WHERE MadID = 1 AND NæringsID = 6) AS DivisionResultat FROM Næringsstoffer
Denne forespørgsel har dog 2 fejl:
1. Den udregner det jo kun for MadID 1 og ikke for hvert MadID. 2. Den returnerer et resultat for hver eneste post i tabellen og ikke for hver DISTINCT MadID.
Kom glædeligt med input eller spørgsmål, hvis min forklaring er helt sort! :-(
Reading this "Jeg skal løbe posterne igennem og kunne dividere et ErnæringsID for et MadID med et andet ErnæringsID for samme MadID. Den skal derfor blot returnere et resultat for hver MadID. "
I would say you want to use something like this
SELECT Næringsstoffer.*, [ErnæringsID ]/[NæringsID ] AS DivisionResultat FROM Næringsstoffer;
but when I read this 2. Den returnerer et resultat for hver eneste post i tabellen og ikke for hver DISTINCT MadID.
I'm not sure what you want. Maybe explain in more detail
indicates to me that the MadID can exist more than once
Synes godt om
Slettet bruger
04. december 2013 - 12:23#3
SELECT Næringsstoffer.MadID, Format((select a.værdi/b.værdi from næringsstoffer a inner join næringsstoffer b on a.madid = b.madid where a.madid = næringsstoffer.madid and a.ernæringsid = [Ernæringsid som tæller:] and b.ernæringsid = [Ernæringsid som nævner:]),"0.000") AS DivisionsResultat FROM Næringsstoffer GROUP BY Næringsstoffer.MadID;
Du er nok nød til at ændre "0.000" til "0,000" i en dansk version af Access!~)
Jeg har ikke haft meget tid til at kigge på det, men jeg kan se at det SQL du gav mig, spg, ser umiddelbart ud til at gøre det jeg prøvede at formulere.
Den giver mig dog et overløb hver gang jeg kører det, men kan se på tallene at resultaterne er i orden. Jeg kan også få division by zero-fejl, så jeg skal lige finde ud af hvordan jeg bedst takler det.
Jeg må lige teste noget mere og inspicere dataen om det er den som er skyld i førstnævnte fejl og så vender jeg tilbage igen.
Kan man egentlig ikke få noget mere avancerede oplysninger ud af Access andet end "Der opstod et overløb"? Måske et post-indeks for hvor fejlen opstod?
Synes godt om
Slettet bruger
05. december 2013 - 09:48#6
Jeg tror ikke du får meget mere info ud af Access, men hvis du ikke kan få det til at virke, så send din db til min email, som du kan finde på min profil!~)
Jeg har nu prøvet forespørgslen og tjekket en del af indholdet, hvor jeg fandt nogle fejl, så der både er blevet korrigeret for, men også nogle (så som nævneren faktisk kan være 0 i sjældne tilfælde).
Den giver mig præcis hvad jeg ønskede mig, så rigtig meget tak for det og også tak for at jeg kunne sende den til dig, hvis det ikke virkede. Sidstnævnte tror jeg dog ikke bliver nødvendigt, da den er så tæt på at være i hus som den er. Nogle gange er det jo en vægtning af at være tæt nok på målet til at man selv kan gå det sidste stykke og udvikle sig, i forhold til at være så langt væk så man slet ikke kan skimte målet! ;-)
Den hiver dog hele resultatsættet ud (efter lidt ventetid eller lidt scrollning som hjælper det på vej!), men hvis jeg går op og i dens kolonnenavn og vælger "Sorter med største/mindste først", så skriver den ALTID "Der opstod et overløb" og hvis der i nogle af udregningerne har været "Division med nul", så skriver den det i stedet. Er det mon logisk eller misforstår jeg noget? Jeg troede at disse fejl burde optræde når man forespørger og ikke når man bagefter sorterer på det resultatsæt man har fået?
Alt dette har dog ledt mig frem til 3 supplerende spørgsmål:
1. Hvordan laver man ORDER BY på det kalkulerede felt DivisionsResultat? (Jeg troede jo naivt at jeg blot tilførte ORDER BY DivisionsResultat i slutningen af SQL-statementet, men så kender den det ikke og vil have at jeg skal indtaste det!)
2. Kan man få den til at returnere f.eks. "-1" hvis der har været division med nul, så jeg kan gribe fejlen og sende den op i min højereliggende kode eller hvordan mon man bøjer den smartest?
Venlig hilsen Kasper
PS. Undskyld for mine lange romaner. Håber ikke at de skræmmer dig væk! ;-)
I Access 2010 kan jeg godt få dataen ud og den viser hvad der ser ud til at være det komplette dataset. Den siger dog "Der opstod et overløb", hvis jeg går op og sorterer på kolonnen!!?
I Access 2007 brokker den sig lige så snart jeg laver forespørgslen med "Der opstod et overløb" og jeg kan derfor slet ikke se outputtet.
Jeg har også prøvet at kode op imod den fra Visual Studio 2010, som også siger at der opstod et overløb.
Jeg er lidt blank og kommer det vidst ikke nærmere i dag.
Normally an overflow occurs if the number is too large for data type. You mentioned that you were also having problems with divide by zero which actually is the root of your problem. If I update all BestLoc which are 0 to 1 then I don't get the error.
So changing the query to this solves the problem and also you are able to see records where b.bestLoc = 0
SELECT Nutrients.FoodId, Format((SELECT a.BestLoc/b.BestLoc FROM Nutrients a INNER JOIN Nutrients b ON a.FoodId = b.FoodId WHERE a.FoodId = Nutrients.FoodId AND a.CompId = 1 and b.CompId = 2 and b.bestLoc <> 0),"Fixed") AS DivisionsResultat FROM Nutrients GROUP BY Nutrients.FoodId;
Jeg beklager at jeg ikke har svaret før nu, men jeg er kommet fra det i jule og nytårs travlhed.
Det var jo egentlig simpelt og logisk nok, men det var nok mere syntaksen jeg kæmpede med. :-)
Jeg har egentlig ét afsluttende spørgsmål og det er at jeg gerne ville kunne sortere ud fra DivisionsResultat (ORDER BY DivisionsResultat ASC). Den syntaks er jeg vidst ret sikker på ikke er mulig og det klodsede er jo så at skrive:
SELECT Nutrients.FoodId, Format((SELECT a.BestLoc/b.BestLoc FROM Nutrients a INNER JOIN Nutrients b ON a.FoodId = b.FoodId WHERE a.FoodId = Nutrients.FoodId AND a.CompId = 1 and b.CompId = 2 and b.BestLoc <> 0),"Fixed") AS DivisionsResultat FROM Nutrients GROUP BY Nutrients.FoodId ORDER BY Format((SELECT a.BestLoc/b.BestLoc FROM Nutrients a INNER JOIN Nutrients b ON a.FoodId = b.FoodId WHERE a.FoodId = Nutrients.FoodId AND a.CompId = 1 and b.CompId = 2 and b.BestLoc <> 0),"Fixed");
Det er Access selv som har generet ovenstående og den fejler!? :-/
Både du og spg har gjort det godt Det sætter jeg stor pris på og jeg vil skam godt sende point i begge retninger, hvis det er?
what you can do is make a new query which just sorts result from your first query.
something like this. It will take longer to run but it works.
SELECT qry1.* FROM qry1 ORDER BY qry1.DivisionsResultat;
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.