mboost-dp1

Kombinere to SELECT sætningers output


Gå til bund
Gravatar #1 - patrickpetersen
23. maj 2011 18:21
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

Databasen ser således ud:
http://peecee.dk/uploads/052011/database_oversigt....

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");
Gravatar #2 - arne_v
23. maj 2011 18:23
SELECT *
FROM (SELECT ...) x JOIN (SELECT ...) y ON x.navn=y.navn
Gravatar #3 - patrickpetersen
23. maj 2011 18:27
#2, den forstår jeg ikke den kommando du har der :/

Skal jeg tage HELE sql 2 og smide ind i sql 1's Select sætning?

Og kan man bruge UNION til det?
Gravatar #4 - arne_v
23. maj 2011 18:29
patrickpetersen (3) skrev:
den forstår jeg ikke den kommando du har der


Trist.

patrickpetersen (3) skrev:
Skal jeg tage HELE sql 2 og smide ind i sql 1's Select sætning?


Nej. Du skal erstatte den første SELECT ... med SQL 1 og den anden med SQL 2.

patrickpetersen (3) skrev:
Og kan man bruge UNION til det?


Nej. UNION putter queries oven over hinanden. JOIN putter queries ved siden af hinanden.
Gravatar #5 - Emil Melgaard
24. maj 2011 06:08
patrickpetersen (3) skrev:
#2, den forstår jeg ikke den kommando du har der :/


Der er en beskrivelse af subqueries her:

http://beginner-sql-tutorial.com/sql-subquery.htm
Gravatar #6 - Mort
24. maj 2011 09:04
Det ville være lidt lettere at svare simpelt på spørgsmålet hvis ikke det var to kæmpe store og sammenblandede queries du bruger som eksempel.

Nu prøver jeg at skære det lidt ud i pap, uden at det bliver for kompliceret at læse:

-- Det samlede resultat her
SELECT T1.Leverandør, T1.[70941]/T2.[544]*100

-- Hele din lange select 1 her
FROM Table1 AS T1

INNER JOIN
(
-- Hele din lange select 2 her
SELECT * FROM Table2
)
AS T2 ON T1.Leverandør=T2.Leverandør
Gravatar #7 - patrickpetersen
24. maj 2011 10:55
#6 Mort, det er fordi det er de 2 queries jeg bruger.. Den er ikke så slem hvis man piller aller inner joins fra.. efter at have prøvet din metode får jeg blot en fejl :(

Simpelt sagt, vil jeg gerne have at den ene række har nogle værdier som har nogle restriktioner (indeholder kun værdier fra katagori 1 og 2) og den anden har det samme række kørende, blot uden restriktionerne.
Gravatar #8 - patrickpetersen
24. maj 2011 11:08
For at gøre det lidt mere overskueligt har jeg lavet et lille billede:

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 :)
Gravatar #9 - Mort
24. maj 2011 11:37
Det gav mig en hel anden forståelse af hvad du har brug for.

Prøv med denne her så:

SELECT T1.Leverandør, T1.År, T1.FejlNavn, T1.FejlTypeNr, AntalFejl/T2.Stk
FROM
(
SELECT Leverandør, År, FejlNavn, FejlTypeNr, SUM(AntalFejl) AS AntalFejl
FROM Table1
GROUP BY Leverandør, År, FejlNavn, FejlTypeNr
) AS T1
INNER JOIN Table2 AS T2 ON T2.Leverandør=T1.Leverandør
Gravatar #10 - patrickpetersen
27. maj 2011 07:11
Mener du sådan her? Eller er jeg helt tabt?
SELECT Leverandør.Navn AS Leverandør, year(dato) AS År, FejlTyper.Fnavn AS FejlNavn, FejlTyper.FtNr AS FejlTypeNr, Round((Sum([Fejl].[AntalF])*100)/Sum([Produktion].[PAntal]),2) AS FejlPct
FROM
(
SELECT Leverandør.Navn, year(dato) AS År, FejlTyper.Fnavn AS FejlNavn, FejlTyper.FtNr AS FejlTypeNr, SUM([Fejl].[AntalF]) AS AntalFejl
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,
) AS T1
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


Og hvordan sørger jeg for, at den fejltype der kommer som tæller i regnestykket kun er fejltype 1 og 2 (leverandørfejl)?
Gravatar #11 - patrickpetersen
27. maj 2011 07:24
Jeg har prøvet at slå op i en SQL bog.. Er det i sådan et tilfælde som mit, at man benytter "DISTINCTROW" ? :)
Gravatar #12 - patrickpetersen
29. maj 2011 02:20
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


Sådan fik jeg det til at virke :) Det car egentlig forholdsvis simple :) Tak for hjælpen! :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login