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

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

KnownHours:

ChargeNum CategoryID Месяц Часы
111111 1 1.09.09   10
111111       1             3/1/09   30
111111       1 04.09.09   50
222222       1             3/1/09   40
111111       2 01.04.09 50

UnknownHours:

ChargeNum Month Hours
111111 1.02.09  70
111111      3/1/09  40,5
222222/1/09 25,5

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

ChargeNum CategoryID Часы
111111 1 90
111111 2 50
111111 Неизвестный 110,5
222222       1              40
222222 Неизвестный 25,5

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

РЕДАКТИРОВАТЬ: мне нужно суммировать часы для каждой комбинации ChargeNum/Category. Я обновил пример данных, чтобы отразить это.

3 ответа

Решение

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

В ожидаемом результате вы получили вторую сумму последней строки неверно, она должна быть 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

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

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

Другие вопросы по тегам