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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top