Avatar billede thepsypher Nybegynder
04. december 2013 - 05:47 Der er 12 kommentarer og
1 løsning

SELECT statement som dividerer en celle med en anden...

Hej eksperter!

Jeg er desværre blevet lidt rusten i SQL og selve tankegangen, så er stødt på problemer ved følgende forespørgsel:


Jeg har en tabel der har følgende data:

MadID    ErnæringsID      Værdi
1            1            2,34
1            2            0,23
1            3            4,67
1            4            10,68
1            5            22,34
1            6            4,30
2            1            3,45
2            2            18,56
2            3            56,23
2            4            11,56
2            5            1,34
2            6            7,89
3            1            5,78
3            2            13,69
3            3            45,78
3            4            12,34
3            5            67,32
3            6            23,92
( og så videre...)

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! :-(

På forhånd tak.

Venlig hilsen
Kasper
Avatar billede terry Ekspert
04. december 2013 - 08:23 #1
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
Avatar billede terry Ekspert
04. december 2013 - 08:24 #2
DISTINCT MadID.

indicates to me that the MadID can exist more than once
Avatar billede 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!~)
Avatar billede thepsypher Nybegynder
05. december 2013 - 05:20 #4
Hej igen.

Indtil videre, så tak for forsøget begge to.

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.

Venlig hilsen
Kasper S.
Avatar billede thepsypher Nybegynder
05. december 2013 - 05:23 #5
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?
Avatar billede 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!~)
Avatar billede thepsypher Nybegynder
06. december 2013 - 05:19 #7
Hej igen...

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! ;-)
Avatar billede thepsypher Nybegynder
10. december 2013 - 05:32 #8
Hmmm....Så har jeg prøvet lidt mere.

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.

Nogen gode idéer?

Venlig hilsen
Kasper
Avatar billede terry Ekspert
10. december 2013 - 17:44 #9
your welcome to send dB to me and I'll take a look.

ekspertenATsanthell.dk
AT = @
Avatar billede terry Ekspert
13. december 2013 - 12:14 #10
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;
Avatar billede terry Ekspert
13. december 2013 - 12:15 #11
And don't worry about points, spg gave answer to SQL
Avatar billede thepsypher Nybegynder
10. januar 2014 - 06:09 #12
Mange tak!...

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?

Venlig hilsen
Kasper
Avatar billede terry Ekspert
10. januar 2014 - 11:50 #13
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;
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