Avatar billede Slettet bruger
07. september 2005 - 12:57 Der 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......
Avatar billede mugs Novice
07. september 2005 - 13:42 #1
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.
Avatar billede 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;

Svar udbedes!~)
Avatar billede kjulius Novice
07. september 2005 - 14:12 #3
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
Avatar billede Slettet bruger
07. september 2005 - 14:23 #4
kjulius>her samler du det hele i en sql, ja?

hvad betyder .tmp
Avatar billede kjulius Novice
07. september 2005 - 14:23 #5
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
Avatar billede Slettet bruger
07. september 2005 - 14:27 #6
Halleluja, nu kører kanonerne i stilling!~)

07/09-2005 14:12:24> er faktisk korrekt....
Avatar billede kjulius Novice
07. september 2005 - 14:32 #7
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.
Avatar billede kjulius Novice
07. september 2005 - 14:41 #8
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
Avatar billede 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.

Jeg syntes i skal deles.... hvad syntes i...
Avatar billede kjulius Novice
07. september 2005 - 14:48 #10
Ingen indvendinger herfra... :-)
Avatar billede Slettet bruger
07. september 2005 - 15:20 #11
mugs....
Avatar billede mugs Novice
07. september 2005 - 16:55 #12
Tak
Avatar billede Slettet bruger
08. september 2005 - 08:38 #13
!~)
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