Объедините две таблицы для одного вывода
Скажем, у меня две таблицы:
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
Но это не дает сумму часов на обе таблицы...