23. maj 2011 - 19:37Der 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");
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.
#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.
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 :)
.. 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.
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");
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? :(
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.
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!
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)
Synes godt om
Ny brugerNybegynder
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.