Jeg skal lave et udtræk, hvor jeg kan beregne fejlprocenten for hvert år. Dette kan gøres ved: Sum(Pantal) / Sum(AntalF) * 100
Problemet er bare, at der kan være flere fejltyper forbundet med hver produktion(ProdRegID), hvilket betyder, at nogle "Pantal" bliver talt med flere gange i summeringen af "Pantal". Jeg har prøvet at gøre følgende:
SELECT Year(fejl.dato), Sum(Pantal) / Sum(AntalF) FROM fejl RIGHT JOIN produktion ON fejl.prodregid = produktion.prodregid GROUP BY Year(fejl.dato)
Men dette giver ikke det rigtige resultat. Hvad er der galt i min jion forbindelse, eller hvordan kan det ellers laves uden at oprette en hjælpe-forespørgsel?
Det er ogsaa komplekst. Jeg maatte selv bakse med det. Min loesning kraever to niveauer af sub-queries som du skal se.
Foerst maa jeg lige sikre mig at jeg forstaar din datastruktur og problemet. Hvis du vil beregne fejlprocenten saa maa det vaere AntalF du dividerer med Pantal, ikke omvendt, og du skal have et datofelt i Fejl. Saa gaar jeg ud fra at ProdRegID er en primaernoegle uden noget noget indhold, men naar du saa finder en fejl ved et eksemplar for eksempel af varenummer 1234 kan jeg ikke se at du kan konstatere hvilket ProdRegID det drejer sig om. Du maa i Fejl skulle referere til varenr i stedet for ProdRegID.
Fejl: id varenr dato fejltype AntalF 1, 1234, 23/12/2009, A, 12 2, 1235, 13/01/2010, C, 8 3, 1235, 13/01/2010, A, 21 4, 1234, 27/03/2010, B, 36
Saa skulle denne query give fejlprocenterne med en decimal:
SELECT f.YEAR(dato), ROUND(SUM(AntalF)/p.psum*100, 1) As fejlprocent FROM Fejl f RIGHT JOIN (SELECT YEAR(dato), (SELECT SUM(Pantal) FROM Produktion p1 WHERE p1.YEAR(dato) = p.YEAR(dato) GROUP BY dato) AS psum FROM Produktion p GROUP BY dato) AS p ON f.YEAR(dato) = p.YEAR(dato) GROUP BY f.YEAR(dato), p.psum
Men det synes at Access ikke understoetter saadanne komplekse joins. Jeg har derfor i hver tabel maatte lave et felt Aar med aarstallet. Saa virker denne query:
SELECT f.aar, ROUND(SUM(AntalF)/p.psum*100, 1) As fejlprocent FROM Fejl f RIGHT JOIN (SELECT aar, (SELECT SUM(Pantal) FROM Produktion p1 WHERE p1.aar = p.aar GROUP BY aar) AS psum FROM Produktion p GROUP BY aar) AS p ON f.aar = p.aar GROUP BY f.aar, p.psum
og giver disse resultater:
aar fejlprocent 2009 2,2 2010 6,6.
Jeg staar og skal afsted. Giv mig dine kommentarer, saa skal jeg se paa det i aften. Jeg skal ogsaa forsoege om jeg kan forenkle det en smule.
MortenJA saa du mit indlaeg? Jeg modtog ingen reaktion. Hvis ovenstaaende besvarer dit spoergsmaal saa afgiv venligst points og luk spoergsmaalet. Hvis de antagelser jeg gjorde var forkerte saa forklar og jeg proever igen. (Jeg er som sagt ogsaa parat til at forsoege at forenkle det hvis du oensker.) Hvis det i mellemtiden er lige meget saa luk venligst spoergsmaalet (opret selv et svar og accepter det) saa der er er ryddet op og du har afsluttet hvad du startede.
Du siger at queryen skal laves i Access. Jeg har lige laest det spoergsmaal du stillede igen. Der viser du en SELECT query og siger at den ikke giver det rigtige resultat (hvilket maa betyde at du allerede har proevet den af i din applikation, antagelig Access,) og dit spoergsmaal gaar ud paa at forbedre forespoergselen. Det er det jeg har proevet at svare paa.
Saa siger du: "Der burde da vaere en maade hvor man kan kringle den paa." Ja. Hvis jeg har forstaaet dig korrekt (desvaerre har du ikke kommenteret paa de antagelser jeg har gjort) saa er maaden denne, som sagt ovenfor:
(1) Korriger din Fejl tabel ved at erstatte ProdRegID feltet med et Varenr felt.
(2) Indfoer, FORELOEBIGT, et felt "aar" i begge tabeller.
(3) Erstat din query med denne query: "SELECT f.aar, ROUND(SUM(AntalF)/p.psum*100, 1) As fejlprocent FROM Fejl f RIGHT JOIN (SELECT aar, (SELECT SUM(Pantal) FROM Produktion p1 WHERE p1.aar = p.aar GROUP BY aar) AS psum FROM Produktion p GROUP BY aar) AS p ON f.aar = p.aar GROUP BY f.aar, p.psum"
Hvis du er interesseret i at samarbejde videre med mig om dette spoergsmaal saa skal jeg gaa igennem det igen, forhaabenlig finde en maade at undgaa at indfoere feltet "aar" i tabellerne, og forklare hvorfor det er noedvendigt at bruge "subselects" (SELECT queries inden i SELECT queries,) og vi kan ogsaa snakke om hvordan man integrerer det i Access. Det kraever fra din side at du svarer/kommenterer paa mit indlaeg #2 (naar der findes en fejl ved et produkt hvordan ved man saa hvilket ProdRegID fejlen hoerer til? Er du enig i at du i Fejl tabellen skal referere til varenr i stedet for ProdRegID? Hvad mener du om mine foreslaaede aendringer til Fejl tabellen? Det select query du viste, hvordan bruger du det i Access?)
Hvis du ikke mener at der er basis for samarbejde, med mindre du saa faar indlaeg fra andre medlemmer (hvilket nok ikke er sandsynligt nu hvor spoergsmaalet er blevet adskillige dage gammelt) saa maa du love mig at lukke spoergsmaalet (opret selv et svar og accepter det.) Jeg finder det skraekkeligt, naar jeg har proevet at goere en indsats, naar man saa lader mig blive haengende i et aabent spoergsmaal.
Spørgsmål: naar der findes en fejl ved et produkt hvordan ved man saa hvilket ProdRegID fejlen hoerer til? Svar: ProdRegID registreres i både tabellen produktion og fejl.
Spørgsmål: Er du enig i at du i Fejl tabellen skal referere til varenr i stedet for ProdRegID? Svar: Det er meget muligt - hvad vil fordelen ved dette være?
Spørgsmål: Hvad mener du om mine foreslaaede aendringer til Fejl tabellen? Svar: Det med at redigere manuelt i tabellerne er helst noget, som jeg vil undgå, da jeg ønsker at bevare tabelstrukturen.
Spørgsmål: Det select query du viste, hvordan bruger du det i Access? Svar: Hvad mener du?
Er det muligt på nogen måde at bruge WHERE EXISTS eller lignende? Jeg er så erfaren i brugen af SQL, så jeg kan umiddelbart ikke se mig ud af det.
Ved du hvad, jeg tror ikke vi kommer videre, vi snakker forbi hinanden. Jeg tror du skal satse paa at faa problemet loest fra anden side. Som sagt, hvis der ikke kommer andre svar paa dette spoergsmaal saa haaber jeg at du lukker det og ikke lader det forblive aabent.
Mit spørgsmål er så, hvordan jeg får opstillet fejlprocenten for hvert år under forudsætning af, at ProdRegID kan optræde flere gange i tabellen Fejl.
Lige pt. er jeg kommet frem til følgende SQL kode, som giver et for højt antal: SELECT Year(produktion.dato), Sum(Pantal) FROM fejl LEFT JOIN produktion ON fejl.prodregid = produktion.prodregid GROUP BY Year(produktion.dato)
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.