2017-06-23 3 views
0

Okay, also ich habe diese 3-Tabellen (Orderrouting, TimeTicketDet, WorkCntr):SQL Join mit aggregierten Spalten

enter image description here

Die vierte Tabelle auf der rechten Seite, ist das, was ich meine Ausgabe brauchen aussehen.

Ich brauche nur Spalten aus den ersten beiden Tabellen, aber da die WorkCntr-Spalten in diesen beiden Tabellen nicht übereinstimmen, muss ich die WorkCntr-Tabelle einbinden, um sie zu binden. Es handelt sich um einen Join mit mehreren Bedingungen, bei dem JobNo und WorkCntr für jede entsprechende Zeile übereinstimmen müssen. Ich brauche jeden Datensatz aus der Tabelle OrderRouting zurückgegeben werden und die TotEstHrs und ManHrs Spalten müssen summiert werden

So für die erste Zeile, können wir JobNo 20166-02 für Cutting sehen, wurde geschätzt, dass 2,25 Stunden und insgesamt ManHrs ist die Summe von 1,15, 0,75 und 0,25

Hier ist, was ich bisher versucht und es hat nicht funktioniert: Reihen

SELECT t.JobNo, w.ShortName, SUM(o.TotEstHrs) AS 'Estimated Hours', 
SUM(t.ManHrs) AS 'Man Hours' 
FROM TimeTicketDet t LEFT JOIN WorkCntr w ON t.WorkCntr = w.WorkCntr RIGHT 
JOIN OrderRouting o ON t.JobNo = o.JobNo and w.ShortName = o.WorkCntr 
WHERE t.JobNo LIKE '20040%' 
AND w.ShortName IN ('Cutting', 'Framing', 'Assembly', 'Grinding', 
'Painting', 'Glazing', 'Locknprep', 'Packaging') 
GROUP BY t.JobNo, w.ShortName 
ORDER BY t.JobNo, w.ShortName; 

es gibt den richtigen JobNo, Short, ManHrs Menge, aber es gibt von OrderRouting fehlt und der TotEstHrs-Wert ist falsch

Ich bin mit SQL Server Management Studio

+1

Warum unterscheiden sich TotalEstHrs-Werte in der Ergebnistabelle von denen in der OrderRouting-Tabelle? (d. h. für Framing und Grading) – TheEsnSiavashi

+0

Hoppla, das war nur ein Tippfehler, machte diese Tabellen in Eile. Ich habe es korrigiert, um zukünftige Leser nicht zu verwirren –

Antwort

1

ich die Abfrage, wie unten mit Gruppierung auf einer Reihe von OrderRouting neu geschrieben vorausgesetzt, es ist die Werte innerhalb einer Tabelle eindeutig sind und verwendet COALESCE Null Mannstunden zurückkehren, wo der Auftrag auf keine Stunden damit verbracht hat, es. Im Folgenden finden Sie die Abfrage

SELECT 
    o.JobNo, 
    o.WorkCntr, 
    o.TotEstHrs, 
    COALESCE(SUM(t.ManHrs), 0) AS ManHrs 
FROM OrderRouting o 
JOIN WorkCntr w ON 
    o.WorkCntr = w.ShortName 
LEFT JOIN TimeTicketDet t ON 
    o.JobNo = t.JobNo 
    AND w.WorkCntr = t.WorkCntr 
WHERE 
    o.JobNo LIKE '20040%' 
    AND w.ShortName IN ('Cutting', 'Framing', 'Assembly', 'Grinding', 'Painting', 'Glazing', 'Locknprep', 'Packaging') 
GROUP BY o.JobNo, o.WorkCntr, o.TotEstHrs 
ORDER BY o.JobNo, o.WorkCntr; 

Ich frage mich, warum Sie o.JobNo LIKE '20040%' wenn Ihre Beispieldaten solche Jobs nicht über, aber ich denke, das ist nur ein Fehler ist, so dass der Code intakt Ich verlasse.

+0

Vielen Dank, der Code funktioniert wie ein Charme. Ich werde es genau studieren. Die '20040%' ist genau der Job, an dem ich gerade gearbeitet habe. Ich habe nicht bemerkt, dass ich in meinen Beispieltabellen eine diff-Job-Nummer hatte –