Kombinieren Sie zwei Tabellen für einen Ausgang
Frage
Sagen wir, ich habe zwei Tabellen:
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 brauche diese Stunden zu einer Gruppe, zu ignorieren Monat, in einem einzigen Datentabelle so, dass mein erwartetes Ergebnis ist die folgende:
ChargeNum CategoryID Hours 111111 1 90 111111 2 50 111111 Unknown 110.5 222222 1 40 222222 Unknown 25.5
Ich kann nicht scheinen, um dies herauszufinden. Jede Hilfe wäre sehr geschätzt!
EDIT: Ich brauche die Stunden für jede ChargeNum / Kategorie Kombination zu summieren. Ich die Beispieldaten aktualisiert, dies zu reflektieren.
Lösung
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 funktioniert
Andere Tipps
Ihre erwartete Ausgabe, können Sie die zweite letzte Zeile Summe falsch haben, sollte es 40 sein nach den Daten in Tabellen, 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 die Ausgabe:
ChargeNum CategoryId
---------- ---------- ----------------------
111111 1 40
111111 2 50
111111 Unknown 70
222222 1 40
222222 Unknown 25.5
Können nehmen wir einen Schritt weiter und sagen, ich will nur die Zeilen sehen, wenn sie kombiniert werden, die 50 Stunden oder mehr haben ... Ich habe dies versucht, aber einen Fehler, dass es nicht SumHours finden ...
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
So 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 das ist nicht die Summe der Stunden gibt auf beiden Tabellen ...