07. september 2005 - 12:57Der er
11 kommentarer og 2 løsninger
Vise alle numre i forespørgsel også dem uden hits
Jeg er kommet i en situation hvor jeg har 2 tabeller med reservedelsnr og i den ene er der et antal og i den anden tabel er der antalbrugt. Disse tal skal jeg selvfølgelig have summeret i visse situationer, hvordan gør jeg det?
Problemet er at hvis jeg laver en forespørgsel og der f.eks. ikke er brugt af et reservedelsnr (AntalBrugt), så fanger den jo heller ikke dem, som er på lager (Antal!~)
Jeg vil helst undgå at lave en decideret lagertabel, fordi at der så skal tilrettes så mange steder i db'en......
Prøv at se på en Union Select hvor du først lister den ene slags (Antalbrugte) og derefter den anden slags (På lager). Jeg har ikke megen forstand på det, men prøv at se i vidensbasen.
Synes godt om
Slettet bruger
07. september 2005 - 14:03#2
Yes...
SELECT Reservedelsnr, Sum(Antal) AS Lager FROM Reservedelsliste GROUP BY Reservedelsnr; UNION SELECT Reservedelsnr, sum(AntalBrugt) AS Lager FROM Reservedele GROUP BY Reservedelsnr;
SELECT Reservedelsnr, Sum(Lager) FROM [SELECT Reservedelsnr, Sum(Antal) AS Lager FROM Reservedelsliste GROUP BY Reservedelsnr UNION ALL SELECT Reservedelsnr, Sum(AntalBrugt) AS Lager FROM Reservedele GROUP BY Reservedelsnr]. tmp GROUP BY Reservedelsnr
Alternativ kunne du også bruge en outer join. Du har sikkert en tabel med beskrivelse af hvert enkelt reservedelsnr. Tag udgangspunkt i denne, og brug outer joins til at knytte de to lagertabeller sammen:
SELECT r.reservedelsnr, r.beskrivelse, sum(o.Antal) AS Originale, Sum(b.AntalBrugt) AS Brugte, Sum(o.Antal) + Sum(b.AntalBrugt) AS SamletLager FROM Reservedele r LEFT JOIN Reservedelsliste o ON r.reservedelsnr = o.reservedelsnr LEFT JOIN Reservedele b ON r.reservedelsnr = b.reservedelsnr
tmp er bare et navn jeg giver den midlertidige forespørgsel der opbygges i UNION ALL instruktionen.
Du kunne også have opbygget det som to selvstændige forespørgsler med UNION på de to tabeller i en forespørgsel og så en anden forespørgsel, hvor du summerer op igen. Du skal jo være opmærksom på, at med en UNION alene ville du kunne ende op med to rows med samme reservedelsnr. De skal summeres igen. Grunden til at jeg har brugt en UNION ALL er, at med en UNION alene ville den kun have returneret én row, hvis du havde det samme reservedelsnr. i begge tabeller og samme antal på lager begge steder.
Access' syntax er ikke helt som andre databasers. Normalt ville kan skrive det som:
SELECT Reservedelsnr, Sum(Lager) FROM (SELECT Reservedelsnr, Sum(Antal) AS Lager FROM Reservedelsliste GROUP BY Reservedelsnr UNION ALL SELECT Reservedelsnr, Sum(AntalBrugt) AS Lager FROM Reservedele GROUP BY Reservedelsnr) tmp GROUP BY Reservedelsnr
Access accepter sådan set ovenstående syntax, men omformer den så til den jeg skrev, altså med firkantede paranteser og punktum.
Et par korrektioner og ændringsforslag til tidligere løsningsforslag:
En alternativ (og måske lettere gennemskuelig) SQL til det første forslag:
SELECT Reservedelsnr, Sum(Lager) FROM [SELECT Reservedelsnr, Antal AS Lager FROM Reservedelsliste UNION ALL SELECT Reservedelsnr, AntalBrugt AS Lager FROM Reservedele]. tmp GROUP BY Reservedelsnr
En korrektion til forslaget ved brug af outer joins:
SELECT r.reservedelsnr, r.beskrivelse, sum(o.Antal) AS Originale, Sum(b.AntalBrugt) AS Brugte, Sum(o.Antal) + Sum(b.AntalBrugt) AS SamletLager FROM Reservedele r LEFT JOIN Reservedelsliste o ON r.reservedelsnr = o.reservedelsnr LEFT JOIN Reservedele b ON r.reservedelsnr = b.reservedelsnr GROUP BY r.reservedelsnr, r.beskrivelse
Synes godt om
Slettet bruger
07. september 2005 - 14:47#9
Ja, nu sidder jeg bare med pointdelingen!~)
Mugs satte mig hurtigt på sporet og jeg fik derved selv løst problemet. kjulius kom med den korrekte syntaks og jeg fik skåret den ekstra forespørgsel væk.
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.