2017-09-30 2 views
0

Ich habe eine Anfrage, um defekte Teile zu bekommen und zusätzlich muss ich den Prozentwert für alle produzierten Teile über einen Zeitraum berechnen.SQL Prozent mit unabhängiger Unterabfrage? Union?

Ich bin ein SQL-Noob, und ich bekomme keine funktionierende Lösung. Ich habe diese zwei Arbeitsquery und ich möchte sie kombinieren, um Prozent über die Anzahl der produzierten Stücke zu berechnen.

Ich versuche es mit einem einfachen Subselect in der Abfrage. Aber dann berechnet er nur die Anzahl der Teile der Schichten, die die fehlerhaften Teile enthalten. Ich bekomme nicht die Summe der Stücke über die gesamte Zeitspanne. Daher möchte ich diese beiden Abfragen kombinieren.

Danach versuche ich Join und Union, aber ich bekomme nur Fehlermeldungen.

Ich kürze und räume die angezeigten Querys auf, um sie verständlicher zu machen. für die Anzahl der Teile

LineName DescDefect Sum(Errors.Rework) 
Line1  Defect1  10 
Line1  Defect3  2 
Line3  Defect12 5 
Line3  Defect53 5 

Abfrage::

(Oracle 11gR2)

Abfrage, um die Teile

SELECT Production.LineName, Names.DescDefect, Sum(Errors.Rework) 
FROM Production, Batchdata, Errors, Names, ShiftData, Shifts 
WHERE ...=... and ShiftData.Date=... 
GROUP Production.Line, Names.DescDefect 
HAVING (Production.LineNumber Like '700_') 
ORDER BY ... 

Ergebnis LINKE diese zu bekommen

SELECT Production.LineName, Sum(Batchdata.Produced) 
FROM Production, Batchdata 
WHERE ...=... AND ((Production.LineNumber Like '700_') AND (ShiftData.Date=...)) 
GROUP BY Production.LineName 

Ergebnis :

LineName Sum(Batchdata.Produced) 
Line1  500 
Line3  700 

Was ich will:

LineName DescDefect Sum(Errors.Rework) percent 
Line1  Defect1  10     2 
Line1  Defect3  2     0,4 
Line3  Defect12 5     0,7 
Line3  Defect53 5     0,7 

Antwort

0

Sie eine Unterabfrage innerhalb select verwenden können Teil Zählungen von einer Ansicht (with clause)

WITH batchd AS 
     (SELECT Production.LineName LineName, 
       Sum(Batchdata.Produced) no_of_parts 
     FROM Production, 
      Batchdata WHERE ...=... 
     AND ((Production.LineNumber LIKE '700_') 
      AND (ShiftData.Date=...)) 
     GROUP BY Production.LineName) 
    SELECT Production.LineName, 
      Names.DescDefect, 
      Sum(Errors.Rework), 
      (Sum(Errors.Rework)/
       (SELECT no_of_parts 
       FROM batchd b 
       WHERE b.LineName = Production.LineName)) * 100 percent 
    FROM Production, 
     Batchdata, 
     Errors, 
     NAMES, 
     ShiftData, 
     Shifts WHERE ...=... 
    AND ShiftData.Date=... 
    GROUP Production.Line, 
      Names.DescDefect 
    HAVING (Production.LineNumber LIKE '700_') 
    ORDER BY ... 
Einnahme