Avatar billede patrickpetersen Nybegynder
23. maj 2011 - 19:37 Der er 13 kommentarer og
1 løsning

Kombinere to SELECT sætningers output

Hejsa :)

Jeg har 2 forskellige outputs, som jeg gerne vil kunne kombinere.

Output 1:
| Leverandør | ÅR | KG |  STK    |
|    Navn    |2005| 10 |  70941  |

Output 2:
| Leverandør | ÅR | Fejlnavn | Fejltypenr | Antal fejl |
|    Navn    |2005|  Ridser  |      1    |    544    |

Jeg ville så gerne kunne krydse de to outputs og få en tabel for jeg udregner 544/70941*100


Output 1 sql :

SELECT Leverandør.Navn AS Leverandør, Format([produktion].[Dato],"yyyy") AS År, Round(Sum(AcrylPlader.Vægt*Produktion.PAntal),2) AS Kg, Sum(Produktion.PAntal) AS Stk
FROM ((Leverandør INNER JOIN AcrylPlader ON Leverandør.LevNr = AcrylPlader.LevNr) INNER JOIN Produkter ON AcrylPlader.PladeNr = Produkter.PladeNr) INNER JOIN Produktion ON Produkter.Vnr = Produktion.Vnr
WHERE (((Produktion.Dato) Between #1/1/2005# And #12/31/2009#))
GROUP BY Leverandør.Navn, Format([produktion].[Dato],"yyyy");



Output 2 sql :
SELECT Leverandør.Navn AS Leverandør, Format([Dato],"yyyy") AS År, FejlTyper.Fnavn AS Fejlnavn, FejlTyper.FtNr AS Fejltypenr, Sum(Fejl.AntalF) AS [Antal fejl]
FROM Leverandør INNER JOIN (((Fejl INNER JOIN FejlTyper ON Fejl.FtNr = FejlTyper.FtNr) INNER JOIN Produkter ON Fejl.Vnr = Produkter.Vnr) INNER JOIN AcrylPlader ON Produkter.PladeNr = AcrylPlader.PladeNr) ON Leverandør.LevNr = AcrylPlader.LevNr
GROUP BY Leverandør.Navn, Format([Dato],"yyyy"), FejlTyper.Fnavn, FejlTyper.FtNr
HAVING (((FejlTyper.FtNr)=1 Or (FejlTyper.FtNr)=2))
ORDER BY Format([Dato],"yyyy");
Avatar billede wanze Nybegynder
23. maj 2011 - 20:57 #1
Det kan nemt løses med UNION-operatøren:

SELECT Leverandør.Navn AS Leverandør, Format([produktion].[Dato],"yyyy") AS År, Round(Sum(AcrylPlader.Vægt*Produktion.PAntal),2) AS Kg, Sum(Produktion.PAntal) AS Stk
FROM ((Leverandør INNER JOIN AcrylPlader ON Leverandør.LevNr = AcrylPlader.LevNr) INNER JOIN Produkter ON AcrylPlader.PladeNr = Produkter.PladeNr) INNER JOIN Produktion ON Produkter.Vnr = Produktion.Vnr
WHERE (((Produktion.Dato) Between #1/1/2005# And #12/31/2009#))
GROUP BY Leverandør.Navn, Format([produktion].[Dato],"yyyy")
UNION
SELECT Leverandør.Navn AS Leverandør, Format([Dato],"yyyy") AS År, FejlTyper.Fnavn AS Fejlnavn, FejlTyper.FtNr AS Fejltypenr, Sum(Fejl.AntalF) AS [Antal fejl]
FROM Leverandør INNER JOIN (((Fejl INNER JOIN FejlTyper ON Fejl.FtNr = FejlTyper.FtNr) INNER JOIN Produkter ON Fejl.Vnr = Produkter.Vnr) INNER JOIN AcrylPlader ON Produkter.PladeNr = AcrylPlader.PladeNr) ON Leverandør.LevNr = AcrylPlader.LevNr
GROUP BY Leverandør.Navn, Format([Dato],"yyyy"), FejlTyper.Fnavn, FejlTyper.FtNr
HAVING (((FejlTyper.FtNr)=1 Or (FejlTyper.FtNr)=2))
ORDER BY Format([Dato],"yyyy");

Hvis der er ens indslag i de to tabeller vil den med ovenstående kode kun tage én af duplikaterne. Man siger, at den kun vælger DISTINCT værdier. Hvis du derimod ønsker, at den tager alt med (også duplikater), så skal du i stedet for blot UNION skrive UNION ALL.
Avatar billede fdata Forsker
23. maj 2011 - 22:48 #2
Hvad med en simpel sammenknytning af de to, f.eks. (ikke testet):

SELECT [Output 1].*, [Output 2].Fejltypenr, [Output 2].[Antal Fejl], [Output 1].Stk * [Output 2].[Antal Fejl] AS DitFelt
FROM [Output 1] INNER JOIN [Output 2] ON [Output 1].Leverandør=[Output 2].Leverandør AND [Output 1].År=[Output 2].År
Avatar billede patrickpetersen Nybegynder
24. maj 2011 - 12:38 #3
#Wanze, hvis jeg skriver koden der får jeg en fejlmeddelse :/

"The number of columns in the two selected tables of queries of a union query do not match"

#fdata, problemet er at i den ene der har jeg en having hvor jeg går ind og definerer på nogle bestemte leverandørfejl typer, som skal tælles. Og i den jeg prøver at fremkalde her, skal jeg have BÅDE de data hvor der kun kommer fejltyperne, men også en hvor der kommer data uden leverandørfejl.
Avatar billede patrickpetersen Nybegynder
24. maj 2011 - 13:10 #4
Lige for at gøre det mere overskueligt.. :)

http://peecee.dk/upload/view/308495

Meningen er, at jeg skal have de 70xxx op i den anden query, men jeg kan ikke få den til at vise 70xxx i første række, da jeg har en HAVING sætning i den, som bestemmer om det er fejltype 1 eller fejltype 2..

Den query jeg gerne vil have skal tage de 544 og 137 og lægge dem sammen, dividere dem med de 70xxx - håber det gør det mere overskueligt :)
Avatar billede fdata Forsker
24. maj 2011 - 22:25 #5
.. men har du testet en løsning, hvor du opretter en ny forespørgsel, der kombinerer de to oprindelige - som foreslået i #2. Jeg kan se, at der en mindre fejl i min udregning; men den er jo let at rette.
Avatar billede patrickpetersen Nybegynder
25. maj 2011 - 22:48 #6
Jeg har prøvet den union i #2 men jeg kan ikke finde fejlen, som den giver..
Avatar billede patrickpetersen Nybegynder
26. maj 2011 - 16:17 #7
Jeg kan simpelthen ikke få de to skiderikker til at virke :(

SELECT Leverandør.Navn AS Leverandør, Format([produktion].[Dato],"yyyy") AS År, Round(Sum(AcrylPlader.Vægt*Produktion.PAntal),2) AS Kg, Sum(Produktion.PAntal) AS Stk
FROM ((Leverandør INNER JOIN AcrylPlader ON Leverandør.LevNr = AcrylPlader.LevNr) INNER JOIN Produkter ON AcrylPlader.PladeNr = Produkter.PladeNr) INNER JOIN Produktion ON Produkter.Vnr = Produktion.Vnr
WHERE (((Produktion.Dato) Between #1/1/2005# And #12/31/2009#))
GROUP BY Format([produktion].[Dato],"yyyy"), Leverandør.Navn;

UNION ALL

SELECT Leverandør.Navn AS Leverandør, Format([Dato],"yyyy") AS År, FejlTyper.Fnavn AS Fejlnavn, FejlTyper.FtNr AS Fejltypenr, Sum(Fejl.AntalF) AS [Antal fejl]
FROM Leverandør INNER JOIN (((Fejl INNER JOIN FejlTyper ON Fejl.FtNr = FejlTyper.FtNr) INNER JOIN Produkter ON Fejl.Vnr = Produkter.Vnr) INNER JOIN AcrylPlader ON Produkter.PladeNr = AcrylPlader.PladeNr) ON Leverandør.LevNr = AcrylPlader.LevNr
GROUP BY Leverandør.Navn, Format([Dato],"yyyy"), FejlTyper.Fnavn, FejlTyper.FtNr
HAVING (((FejlTyper.FtNr)=1 Or (FejlTyper.FtNr)=2))
ORDER BY Format([Dato],"yyyy");
Avatar billede patrickpetersen Nybegynder
26. maj 2011 - 21:31 #8
Fdata, hvordan vil dit post se ud? Jeg kan heller ikke få den til at virke, jeg har prøvet en times tid uden held
Avatar billede patrickpetersen Nybegynder
27. maj 2011 - 09:18 #9
Jeg er nu endelig fået den UNION til at virke..

SELECT Leverandør.Navn AS Leverandør, year(dato) AS År, Round(Sum(AcrylPlader.Vægt*Produktion.PAntal),2) AS Kg, Sum(Produktion.PAntal) AS Stk
FROM ((Leverandør INNER JOIN AcrylPlader ON Leverandør.LevNr = AcrylPlader.LevNr) INNER JOIN Produkter ON AcrylPlader.PladeNr = Produkter.PladeNr) INNER JOIN Produktion ON Produkter.Vnr = Produktion.Vnr
GROUP BY Leverandør.Navn, year(dato)
UNION SELECT Leverandør.Navn AS Leverandør, year(dato)  AS År, FejlTyper.FtNr AS Fejltypenr, Sum(Fejl.AntalF) AS [Antal fejl]
FROM Leverandør INNER JOIN (((Fejl INNER JOIN FejlTyper ON Fejl.FtNr = FejlTyper.FtNr) INNER JOIN Produkter ON Fejl.Vnr = Produkter.Vnr) INNER JOIN AcrylPlader ON Produkter.PladeNr = AcrylPlader.PladeNr) ON Leverandør.LevNr = AcrylPlader.LevNr
GROUP BY Leverandør.Navn, year(dato) , FejlTyper.Fnavn, FejlTyper.FtNr
HAVING (((FejlTyper.FtNr)=1 Or (FejlTyper.FtNr)=2));


PROBLEMET er nu, at outputtet ikke er som det skal..
Den giver
Leverandør År KG STK (hvor stk er en kombination er både fejltype 1&2 samt antal total producerede emner, hvad gør jeg forkert? :(
Avatar billede fdata Forsker
27. maj 2011 - 14:25 #10
Jeg er lidt forvirret ovet at I knokler med en union. Mit forslag ville stadig være en en simpel join:

Du gemmer de to forespørgsler, som du viser i dit oprindelige spørgsmål, som Output 1 og Output 2 (ja, det er lidt underlige forespørgselsnavne)

Så opretter du en tredje forespørgsel med følgende sql:

SELECT [Output 1].*, [Output 2].Fejltypenr, [Output 2].[Antal Fejl], [Output 1].Stk, ([Output 2].[Antal Fejl]/[Output 1].Stk * 100) AS DitFelt
FROM [Output 1] INNER JOIN [Output 2] ON [Output 1].Leverandør=[Output 2].Leverandør AND [Output 1].År=[Output 2].År

That's it.
Avatar billede fdata Forsker
27. maj 2011 - 14:27 #11
PS: En union er jo en mekanisme til at samle flere datasæt med samme struktur (samme felter, samme rækkefølge, samme datatype). Det er der jo ikke tale om her - med mindre du vrider datasættene grundigt.
Avatar billede patrickpetersen Nybegynder
27. maj 2011 - 14:59 #12
Jeg har prøvet den efterfølgende, jeg må bare gøre noget forkert, for når jeg prøver ar køre forespørgslen lukker programmet ned :$
Avatar billede patrickpetersen Nybegynder
28. maj 2011 - 17:00 #13
Fdata: Jeg fik det til at virke! Fuck hvor lækkert.. Jeg anede ikke man kunne krydse output i access.. Det gør lige pludselig rigtig mange ting lettere!
Avatar billede fdata Forsker
30. maj 2011 - 21:40 #14
Yep. Access er ret snedig på det punkt. Man kan komme ud for at have 4-5 forespørgsler, der "står på ryggen af hinanden", hvor hver især løser sin lille del af den samlede opgave.
God fornøjelse med den fortsatte programmering og tak for point ;o)
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