Combinar duas tabelas para uma saída
Pergunta
Say Eu tenho duas tabelas:
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
Eu preciso agrupar estas horas, ignorando mês, em uma única tabela de dados para que o meu resultado esperado é o seguinte:
ChargeNum CategoryID Hours 111111 1 90 111111 2 50 111111 Unknown 110.5 222222 1 40 222222 Unknown 25.5
Eu não consigo descobrir isso. Qualquer ajuda seria muito apreciada!
EDIT: eu preciso somar as horas para cada combinação ChargeNum / categoria. Eu atualizei os dados de exemplo para refletir isso.
Solução
Você vai precisar usar UNION
para combinar os resultados de duas consultas. No seu caso:
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
Nota -. Se você usar UNION ALL
tal como em cima, ele não mais lento do que executar as duas consultas separadamente como faz nenhuma duplicata de verificação é
Outras dicas
Em sua saída esperada, você tem a segunda soma última linha incorreta, deve ser 40 de acordo com os dados em suas tabelas, mas aqui é a consulta:
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
E aqui está a saída:
ChargeNum CategoryId
---------- ---------- ----------------------
111111 1 40
111111 2 50
111111 Unknown 70
222222 1 40
222222 Unknown 25.5
Podemos levar isso um passo mais longe e diz que eu só quero ver linhas quando combinada que tem 50 horas ou mais ... Eu tentei isso, mas recebo um erro que ele não pode encontrar 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
Então, eu tentei
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
Mas isso não é dando a soma das horas em ambas as tabelas ...