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.

¿Fue útil?

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.

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