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