Объедините две таблицы для одного вывода
Вопрос
Скажем, у меня есть две таблицы:
Известные часы:
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
Неизвестные часы:
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
Кажется, я не могу этого понять.Любая помощь будет принята с благодарностью!
РЕДАКТИРОВАТЬ:Мне нужно суммировать часы для каждой комбинации ChargeNum/Category.Я обновил примеры данных, чтобы отразить это.
Решение
Вам нужно будет использовать 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
Но это не дает суммы часов в обеих таблицах...