2017-09-30 2 views
0

J'ai une requête pour obtenir des pièces défectueuses et en plus j'ai besoin de calculer la valeur en pourcentage à toutes les pièces produites sur une période de temps.Pourcentage de calcul SQL avec sous-requête indépendante? syndicat?

Je suis un SQL Noob, et je ne travaille pas solution. J'ai ces deux requêtes de travail et je veux les combiner pour calculer le pourcentage sur le nombre de pièces produites.

J'essaie avec un sous-select facile dans la requête. Mais alors il ne calcule que le nombre de pièces des décalages qui contiennent les parties défectueuses. Je ne comprends pas la somme des pièces sur toute la durée. Donc, je veux combiner ces deux querys. Après cela, j'essaie de joindre et d'union mais je reçois seulement des messages d'erreur.

Je raccourcir et remanier les requêtes affichées pour les rendre plus compréhensibles.

(Oracle 11gR2)

requête pour obtenir les pièces

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 ... 

Résultat linke ceci:

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

requête pour le nombre de pièces:

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

Résultat :

LineName Sum(Batchdata.Produced) 
Line1  500 
Line3  700 

Ce que je veux:

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 

Répondre

0

Vous pouvez utiliser une sous-requête dans les select prenant part compte d'une vue (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 ...