2009-08-04 25 views
41

Sagen wir, ich habe zwei Tabellen:Kombinieren Sie zwei Tabellen für einen Ausgang

KnownHours:

 
ChargeNum CategoryID Month Hours 
111111  1    2/1/09 10 
111111  1    3/1/09 30 
111111  1    4/1/09 50 
222222  1    3/1/09 40 
111111  2    4/1/09 50 

UnknownHours:

 
ChargeNum Month Hours 
111111  2/1/09 70 
111111  3/1/09 40.5 
222222  7/1/09 25.5 

ich diese Stunden zu einer Gruppe benötigen, ignorieren Monat, in einem einzigen Datentabelle, so dass mein erwartetes Ergebnis das folgende ist:

 
ChargeNum CategoryID  Hours 
111111  1    90 
111111  2    50 
111111  Unknown  110.5 
222222  1    40 
222222  Unknown  25.5 

Ich kann das nicht herausfinden. Jede Hilfe würde sehr geschätzt werden!

EDIT: Ich muss die Stunden für jede ChargeNum/Kategorie Kombination summieren. Ich habe die Beispieldaten aktualisiert, um dies zu berücksichtigen.

Antwort

65

Sie müssen UNION verwenden, um die Ergebnisse von zwei Abfragen zu kombinieren. In Ihrem Fall:

SELECT ChargeNum, CategoryID, SUM(Hours) 
FROM KnownHours 
GROUP BY ChargeNum, CategoryID 
UNION ALL 
SELECT ChargeNum, 'Unknown' AS CategoryID, SUM(Hours) 
FROM UnknownHours 
GROUP BY ChargeNum 

Hinweis - Wenn Sie UNION ALL wie oben verwenden, ist es nicht langsamer als laufen die beiden Abfragen getrennt, da sie keine doppelte Kontrolle tut.

+0

Ich habe gehört, diese außergewöhnlich langsam ist. Gibt es einen anderen Weg, dies zu tun? –

+0

Die einzige Sache, die möglicherweise schneller wäre, ist, die Daten in einer Tabelle, nicht zwei zu speichern. Verwenden Sie 'CategoryID = NULL' für unbekannte Stunden. –

+4

@Matthew: Wo hast du das gehört? "Union all" ist absolut schnell. – Eric

11

In Ihrem erwarteten Ausgabe, haben Sie die zweite letzte Zeile Summe falsch bekam er 40 nach den Daten in Ihren Tabellen sein sollte, aber hier ist die Abfrage:

Select ChargeNum, CategoryId, Sum(Hours) 
From (
    Select ChargeNum, CategoryId, Hours 
    From KnownHours 
    Union 
    Select ChargeNum, 'Unknown' As CategoryId, Hours 
    From UnknownHours 
) As a 
Group By ChargeNum, CategoryId 
Order By ChargeNum, CategoryId 

Und hier ist der Ausgang : nur Zeilen wollen sehen

ChargeNum CategoryId 
---------- ---------- ---------------------- 
111111  1   40 
111111  2   50 
111111  Unknown 70 
222222  1   40 
222222  Unknown 25.5 
+0

Vielen Dank, das ist, was ich brauchte, um mein Problem zu lösen! :) – Alexander

1

können wir das noch einen Schritt weiter und sagen, dass ich, wenn kombiniert, die 50 Stunden oder mehr ... ich habe dies habe versucht, aber einen Fehler, dass es nicht finden können, SumHours ...

Select ChargeNum, CategoryId, Sum(Hours) As SumHours 
From (
    Select ChargeNum, CategoryId, Hours 
    From KnownHours 
    Union 
    Select ChargeNum, 'Unknown' As CategoryId, Hours 
    From UnknownHours 
) As a 
WHERE (SumHours>=50) 
Group By ChargeNum, CategoryId 
Order By ChargeNum, CategoryId 

Also habe ich versucht

Select ChargeNum, CategoryId, Sum(Hours) As SumHours 
From (
    Select ChargeNum, CategoryId, Hours 
    From KnownHours 
    Union 
    Select ChargeNum, 'Unknown' As CategoryId, Hours 
    From UnknownHours 
) As a 
WHERE (Hours>=50) 
Group By ChargeNum, CategoryId 
Order By ChargeNum, CategoryId 

Aber dies gibt nicht die Summe der Stunden auf beiden Tischen ...