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.

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top