2017-09-18 1 views
1

Je dois totaliser des minutes estimées de 3 requêtes différentes en 1 requête SQL. J'ai 3 vues (une pour les pièces découpées sur la machine A par le travail, une pour les pièces découpées sur la machine B par le travail, et une coupe sur la machine C par le travail). J'ai une autre table qui a une liste de toutes les parties qui ont un temps de coupe estimé, nous appellerons TableA. J'ai écrit trois requêtes différentes en utilisant les vues qui ont quitté la jointure sur TableA pour additionner les temps de coupure. Cependant, je veux une requête qui renvoie une table avec une liste de travaux et le temps de coupe estimé pour chaque travail par machine. Chaque rangée devrait donc être suivie de trois temps de coupe estimés ventilés par chaque machine.Fusion de 3 vues sql en 1 requête à l'aide d'une table de recherche SQL

--------Machine A------- 
SELECT 
sum(TableA.[minutes]) as 'total', MachineA.JobNum 
FROM MachineA 
LEFT JOIN TableA on 
TableA.Part = MachineA.PART 
WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
group by MachineA.Job 

--------Machine B------- 
SELECT 
sum(TableA.[minutes]) as 'total', MachineB.JobNum 
FROM MachineB 
LEFT JOIN TableA on 
TableA.Part = MachineB.PART 
WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
group by MachineB.Job 

--------Machine C------- 
SELECT 
sum(TableA.[minutes]) as 'total', MachineC.JobNum 
FROM MachineC 
LEFT JOIN TableA on 
TableA.Part = MachineC.PART 
WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
group by MachineC.Job 

Exemple de table Je cherche

Job | MachinA_Time | MachineB_Time | MachineC_Time| 
---------------------------------------------------- 
123 | 345   | 512   | 452   | 
124 | 215   | 351   | 356 
+0

Rejoignez le travail #? – LONG

+0

@long Que voulez-vous dire rejoindre sur le travail? Comment ferais-je tout cela en une seule requête? – Cheddar

+0

Merci pour toutes les réponses les gars je l'apprécie vraiment. Je vais gérer les 3 solutions et m'assurer qu'elles fonctionnent et commentent toutes. – Cheddar

Répondre

2

Avec UNION vous pouvez le faire:

SELECT JobNum 
    ,MAX(MachinA_Time) AS MachinA_Time 
    ,MAX(MachinB_Time) AS MachinB_Time 
    ,MAX(MachinC_Time) AS MachinC_Time 
FROM 
(

    SELECT MachineA.JobNum, sum(TableA.[minutes]) as MachinA_Time, NULL AS MachinB_Time, NULL AS MachinA_Time 
    FROM MachineA 
    LEFT JOIN TableA on TableA.Part = MachineA.PART 
    WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
    group by MachineA.Job 
    UNION ALL 
    SELECT MachineB.JobNum, NULL, sum(TableA.[minutes]), NULL 
    FROM MachineB 
    LEFT JOIN TableA on 
    TableA.Part = MachineB.PART 
    WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
    group by MachineB.Job 
    UNION ALL 
    SELECT MachineC.JobNum, NULL, NULL, sum(TableA.[minutes]) 
    FROM MachineC 
    LEFT JOIN TableA on 
    TableA.Part = MachineC.PART 
    WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
    group by MachineC.Job 

) AS t 
GROUP BY JobNum 
1

Il suffit de se joindre à chaque résultat basé sur le travail de partage #:

WITH MachineA 
AS 
(
SELECT 
sum(TableA.[minutes]) as 'total', MachineA.JobNum 
FROM MachineA 
LEFT JOIN TableA on 
TableA.Part = MachineA.PART 
WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
group by MachineA.Job 
), 
MachineB 
as 
(- 
SELECT 
sum(TableA.[minutes]) as 'total', MachineB.JobNum 
FROM MachineB 
LEFT JOIN TableA on 
TableA.Part = MachineB.PART 
WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
group by MachineB.Job 
), 
    MachineC 
as 
(
SELECT 
sum(TableA.[minutes]) as 'total', MachineC.JobNum 
FROM MachineC 
LEFT JOIN TableA on 
TableA.Part = MachineC.PART 
WHERE TableA.OP = 10 and OP_DISABLE IS NULL 
group by MachineC.Job 
) 

SELECT A.JobNum as Job, MachineA.total as MachineATime, MachineB.total as MachineBTime, MachineC.total as MachineCTime 
FROM MachineA as A 
INNER JOIN MachineB as B 
ON B.JobNum = A.JobNum 
INNER JOIN MachineC as C 
ON C.JobNum = A.JobNum 
+0

6 se joint? .. Il peut être fait avec 1. – sagi

+0

ouais, je suis juste en utilisant le plus stupide xD, le vôtre est la façon élégante et délicate xD – LONG

+0

Cela fonctionne, Merci, – Cheddar

2

Je pense que vous pouvez enregistrer un nécessaire en utilisant l'agrégation joint conditionnelle et UNION, puisque le format est le même

SELECT p.jobnum, 
     SUM(CASE WHEN t.machine = 'A' THEN t.[minutes] END) as machineA_Time, 
     SUM(CASE WHEN t.machine = 'B' THEN t.[minutes] END) as machineB_Time, 
     SUM(CASE WHEN t.machine = 'C' THEN t.[minutes] END) as machineC_Time 
FROM(SELECT s.minutes,s.part,'A' as machine FROM MachineA s 
    UNION ALL 
    SELECT s.minutes,s.part,'B' FROM MachineB s 
    UNION ALL 
    SELECT s.minutes,s.part,'C' FROM MachineC s) t 
JOIN TableA p 
ON(p.part = t.part) 
WHERE p.op = 10 
GROUP BY p.jobnum 

Cette requête peut avoir besoin des ajustements supplémentaires, comme je ne sais pas où OP_DISABLE IS NULL vient.