Agrupar al unir la misma mesa dos veces.
Pregunta
Estoy escribiendo una consulta para resumir algunos datos. Tengo una marca en la tabla que es básicamente booleana, por lo que necesito algunas sumas y cuentas basadas en un valor de la misma, y ??luego lo mismo para la otra, como por ejemplo:
select
location
,count(*)
,sum(duration)
from my.table
where type = 'X'
and location = @location
and date(some_tstamp) = @date
group by location
Y luego lo mismo para otro valor de la columna de tipo. Si me uno a esta tabla dos veces, ¿cómo sigo agrupando para que solo pueda obtener la agregación de cada tabla, es decir, contar (a. *
) en lugar de contar (*) ...
¿Sería mejor escribir dos consultas separadas?
EDIT
Gracias a todos, pero eso no es lo que quise decir. Necesito obtener un resumen donde escriba = 'X' y un resumen donde escriba = 'Y' por separado ... déjeme publicar un mejor ejemplo. Lo que quise decir fue una consulta como esta:
select
a.location
,count(a.*)
,sum(a.duration)
,count(b.*)
,sum(b.duration)
from my.table a, my.table b
where a.type = 'X'
and a.location = @location
and date(a.some_tstamp) = @date
and b.location = @location
and date(b.some_tstamp) = @date
and b.type = 'Y'
group by a.location
¿Qué necesito para agrupar? Además, a DB2 no le gusta contar (a. *
), es un error de sintaxis.
Solución
select
location
,Sum(case when type = 'X' then 1 else 0 end) as xCount
,Sum(case when type = 'Y' then 1 else 0 end) as YCount
,Sum(case when type = 'X' then duration else 0 end) as xCountDuration
,Sum(case when type = 'Y' then duration else 0 end) as YCountDuration
from my.table
where
location = @location
and date(some_tstamp) = @date
group by location
Esto debería funcionar en SQL Server. Supongo que db2 debería tener algo similar.
Editar: agregue una condición where para limitar los registros para seleccionar type = X o type = Y, si " type " puede tener un valor distinto de X e Y.
Otros consejos
Tu ejemplo con la unión no tiene mucho sentido. Estás haciendo un producto cartesiano entre A y B. ¿Es esto realmente lo que quieres?
Lo siguiente encontrará el recuento (*) y la suma (duración) para cada par que satisfaga la cláusula WHERE. Según su descripción, esto suena como lo que está buscando:
select
type
,location
,count(*)
,sum(duration)
from my.table
where type IN ('X', 'Y')
and location = @location
and date(some_tstamp) = @date
group by type, location
Para hacer que los conteos funcionen, en lugar de contar (a. *) solo cuenta (a.location), o cualquier otra columna que no sea nula (el PK sería ideal).
En cuanto a la pregunta principal, cualquiera de las respuestas dadas por shahkalpesh o George Eadon anteriormente funcionaría. No hay ninguna razón en este ejemplo para unir la tabla dos veces.