Avatar billede MortenJA Nybegynder
14. maj 2010 - 15:57 Der er 7 kommentarer og
1 løsning

Forkert joinforbindelse

Problemet tager udgangspunkt i følgende to tabeller:

Produktion: ProdRegID, Varenr, Dato, Pantal osv.
Fejl: FejlRegID, ProdRegID, Fejltype, AntalF

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?
15. maj 2010 - 09:18 #1
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.

Jeg oprettede, for test, disse tabeller:

Produktion:
id  varenr dato          Pantal
1, 1234, 30/10/2009, 350
2, 1235, 15/12/2009, 200
3, 1234, 15/01/2010, 320
4, 1234, 22/04/2010, 510
5, 1235, 23/04/2010, 150

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.
16. maj 2010 - 09:29 #2
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.
Avatar billede MortenJA Nybegynder
16. maj 2010 - 14:49 #3
Tak for forsøget, men jeg må erkende, at jeg ikke helt forstår den første query. Det skal desværre laves i Access.

Der burde da være en måde, hvor man kan kringle den på? Det irriterer mig i hvert fald lidt!
16. maj 2010 - 21:11 #4
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.
Avatar billede MortenJA Nybegynder
16. maj 2010 - 22:38 #5
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.
17. maj 2010 - 06:34 #6
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.
Avatar billede MortenJA Nybegynder
17. maj 2010 - 15:21 #7
Min opgave er som følgende. Jeg har følgende database med relationer:

http://www.billedeupload.dk/photo/2010-05/50c05adc/relationer.JPG.html

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)
Avatar billede MortenJA Nybegynder
19. maj 2010 - 14:08 #8
Lukket
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