Pregunta

Digamos que tengo dos tablas:

Horas conocidas:

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

Necesito agrupar estas horas, ignorando Month, en una sola tabla de datos para que mi resultado esperado sea el siguiente:

ChargeNum    CategoryID     Hours
111111       1              90
111111       2              50
111111       Unknown        110.5
222222       1              40
222222       Unknown        25.5

Parece que no puedo entender esto. Cualquier ayuda sería muy apreciada!

EDITAR: necesito sumar las horas para cada combinación ChargeNum / Category. Actualicé los datos de muestra para reflejar esto.

¿Fue útil?

Solución

Deberá usar UNION para combinar los resultados de dos consultas. En su 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: si usa UNION ALL como en el caso anterior, no es más lento que ejecutar las dos consultas por separado, ya que no realiza una comprobación de duplicados.

Otros consejos

En su salida esperada, tiene la suma de la segunda última fila incorrecta, debe ser 40 según los datos en sus tablas, pero aquí está la 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

Y aquí está el resultado:

ChargeNum  CategoryId 
---------- ---------- ----------------------
111111     1          40
111111     2          50
111111     Unknown    70
222222     1          40
222222     Unknown    25.5

¿Podemos ir un paso más allá y decir que solo quiero ver filas cuando se combinan que tienen 50 horas o más ... He intentado esto, pero aparece un error que dice que no puede 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

Entonces lo intenté

    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

Pero esto no da la suma de las horas en ambas tablas ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top