Объедините две таблицы для одного вывода

Скажем, у меня две таблицы:

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

Мне нужно сгруппировать эти часы, игнорируя месяц, в одну таблицу данных, чтобы мой ожидаемый результат был следующим:

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

Я не могу понять это. Любая помощь будет принята с благодарностью!

EDIT: мне нужно суммировать часы для каждой комбинации ChargeNum/Category. Я обновил образцы данных, чтобы отразить это.

Ответы

Ответ 1

Вам понадобится использовать UNION, чтобы объединить результаты двух запросов. В вашем случае:

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

Примечание. Если вы используете UNION ALL, как указано выше, это не медленнее, чем запуск двух запросов отдельно, так как он не проверяет дубликаты.

Ответ 2

В вашем ожидаемом выходе у вас вторая неверная сумма последней строки, она должна быть 40 согласно данным в ваших таблицах, но вот запрос:

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

И вот вывод:

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

Ответ 3

Можем ли мы сделать это шаг дальше и сказать, что я хочу видеть только строки, когда они имеют 50 часов или более... Я пробовал это, но получаю сообщение об ошибке, что он не может найти 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

Итак, я попробовал

    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

Но это не дает сумму часов на обе таблицы...