Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

¿Se puede en Oracle en un select poner dos count con distinto where?

Estas en el tema de ¿Se puede en Oracle en un select poner dos count con distinto where? en el foro de Oracle en Foros del Web. Imaginad que quiero hacer un count, según determinadas condiciones, y otro count según otras. ¿Puedo obtenerlo todo con una misma instrucción? Sí se puede cuando ...
  #1 (permalink)  
Antiguo 12/02/2008, 10:06
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
¿Se puede en Oracle en un select poner dos count con distinto where?

Imaginad que quiero hacer un count, según determinadas condiciones, y otro count según otras. ¿Puedo obtenerlo todo con una misma instrucción?

Sí se puede cuando de lo que se habla es del distinct, que te permite tenerlo al lado de un count y cada cual contará lo suyo, ¿pero se pueden poner dos count que se basen en distinta where? (tal vez para ello habría que realizar dos selects, y "unirlas" de algún modo para que fueran dos columnas (si utilizas union sería como registros distintos)).

Gracias
  #2 (permalink)  
Antiguo 12/02/2008, 10:11
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
Re: ¿Se puede en Oracle en un select poner dos count con distinto where?

Imagino que la forma de hacerlo únicamente pasa por realizar una JOIN de las dos select's distintas.

¿Y cómo se realiza una JOIN de dos selects? Cuando no me da error porque "no es un nombre de tabla válido", me lo da por asignarle incorrectamente el alias.
  #3 (permalink)  
Antiguo 05/03/2008, 10:44
Avatar de Osirapis  
Fecha de Ingreso: abril-2006
Ubicación: Granada - Sevilla. (la Tierra)
Mensajes: 89
Antigüedad: 18 años
Puntos: 0
Re: ¿Se puede en Oracle en un select poner dos count con distinto where?

Aquí se cuentan dos campos (distintos o no) CAMPO1 y CAMPO2 de una misma tabla TBL_01 dependiendo de condiciones distintas condicion1 y condicion2:
Código:
SELECT 
  COUNT(1) CAMPO1, 
  (SELECT 
     COUNT(2) CAMPO2 
   FROM TBL_01
   WHERE 
      CAMPO2 = :condicion2
  ) 
FROM 
  TBL_01
WHERE 
  CAMPO1 = :condicion1
GROUP BY 2;
Por si no te suena, las ":condicion1" y ":condicion2" con variables BIND o HOST para que puedas hacer las búsquedas dinámicas, aprovecharte del CBO (evitando calcular una y mil veces planes de ejecución) y mejorar el rendimiento de esa SELECT.

Un saludo.
__________________
Solo hay 10 tipos de personas: los que saben binario y los que no. ; )P
  #4 (permalink)  
Antiguo 14/03/2008, 04:43
 
Fecha de Ingreso: marzo-2008
Mensajes: 4
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: ¿Se puede en Oracle en un select poner dos count con distinto where?

Hola a todos,
soy nueva en esto del pl/sql, y tengo la misma duda que programadornet.

He probado las soluciones que habeis dado y no me funcionan o no las he sabido aplicar.

Mi problema es el siguiente:

tengo una tabla con los siguientes atributos:

grupo, canal,prioridad, mes, año

para cada grupo y canal debo obtener el numero de filas con prioridad alta y el total de filas que hay.
Debo de tener en cuenta que existen filas con valores nulos para el canal y tambien debo recogerlos

ejemplo:

grupo canal prioridad alta total
-------- --------- ------------------- ---------

grupo1 teléfono 117 200
grupo1 email 3 10
grupo1 chat 35 98
grupo1 20 50


He hecho:

SELECT grupo, canal,
COUNT(*) AS "CAMPO1",
(select count(*)
from incidencias
where mes = 2
and ano= 2008
and grupo=2
group by grupo, canal
) AS "CAMPO2"
FROM
incidencias
where prioridad=2
and mes = 2
and ano= 2008
and grupo=2
group by grupo, canal

Pero no me funciona. Me sale el siguiente error:
ORA-01427: la subconsulta de una sola fila devuelve más de una fila


Gracias
  #5 (permalink)  
Antiguo 19/03/2008, 07:43
Avatar de Osirapis  
Fecha de Ingreso: abril-2006
Ubicación: Granada - Sevilla. (la Tierra)
Mensajes: 89
Antigüedad: 18 años
Puntos: 0
Re: ¿Se puede en Oracle en un select poner dos count con distinto where?

Hola Pukas.

En tu caso particular, no tienes por qué poner el GROUP BY en tu subselect.

Cita:
(select count(*)
from incidencias
where mes = 2
and ano= 2008
and grupo=2
group by grupo, canal
)
Ya que esa SELECT devuelve un solo campo que, además, es una función de grupo (COUNT()), no tendrás que utilizar los GROUP BY. Lo que sí que necesitarás es poner en SELECT grande, un GROUP BY CAMPO2

Sería algo así:

Código:
SELECT grupo, canal,
COUNT(*) AS "CAMPO1",
(select count(*) AS "CAMPO2"
from incidencias
where mes = 2
and ano= 2008
and grupo=2
group by grupo, canal
) 
FROM
incidencias
where prioridad=2
and mes = 2
and ano= 2008
and grupo=2
group by grupo, canal, CAMPO2 
Pero esta SELECT tan solo te va a devolver UNA FILA, así no tendrás lo que esperas tener (lo que has puesto en tu ejemplo).
__________________
Solo hay 10 tipos de personas: los que saben binario y los que no. ; )P
  #6 (permalink)  
Antiguo 24/03/2008, 02:47
 
Fecha de Ingreso: marzo-2008
Mensajes: 4
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: ¿Se puede en Oracle en un select poner dos count con distinto where?

Gracias Osirapi,

pero como tu decias no es lo q estoy buscando.

Pensé en crear dos funciones:

Una para obtener un count() con prioridad=2

create or replace FUNCTION fn_Obtener_prioridad_canal(n_nivel number,n_canal number, n_mes number,n_ano number)
RETURN NUMBER
IS
result number;
begin
select count(*)
into result
from incidencias
where grupo(+) = grupo
and canal(+) = canal
and prioridad(+)=prioridad
and prioridad=2
and mes = n_mes
and ano= n_ano
and grupo=n_nivel
and canal=n_canal
group by grupo,canal;
return( result);
EXCEPTION
WHEN NO_DATA_FOUND
THEN return 0;
END fn_Obtener_prior_canal;

y otro para obtener el count() total

create or replace FUNCTION fn_Obtener_total_canal(n_nivel number,n_canal number, n_mes number, n_ano number)
RETURN NUMBER
IS
result number;
begin
select count(*)
into result
from incidencias
where grupo(+) = grupo
and canal(+) = canal
and prioridad(+)=prioridad
and mes = n_mes
and ano= n_ano
and grupo=n_nivel
and canal=n_canle
group by grupo,canal;
return( result);
EXCEPTION
WHEN NO_DATA_FOUND
THEN return 0;
END fn_Obtener_total_canal;

luego llamaría a las dos funciones desde otro select:


select distinct grupo, canal,
nvl(fn_Obtener_prior_canal(grupo,canal, mes,ano),0) as "Nº Críticos",
nvl(fn_Obtener_total_canal(grupo,canal,mes,ano),0) as "Nº Total"
from incidencias
where grupo(+) = grupo
and canal(+) = canal
and mes =2
and ano=2008
and grupo=2

pero no cuenta las filas con campos nulos.

No se en que estoy fallando.

A ver si me podeis echar una mano.

Gracias.:
  #7 (permalink)  
Antiguo 24/03/2008, 08:37
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: ¿Se puede en Oracle en un select poner dos count con distinto where?

Cita:
Iniciado por programadornet Ver Mensaje
Imaginad que quiero hacer un count, según determinadas condiciones, y otro count según otras. ¿Puedo obtenerlo todo con una misma instrucción?

Sí se puede cuando de lo que se habla es del distinct, que te permite tenerlo al lado de un count y cada cual contará lo suyo, ¿pero se pueden poner dos count que se basen en distinta where? (tal vez para ello habría que realizar dos selects, y "unirlas" de algún modo para que fueran dos columnas (si utilizas union sería como registros distintos)).

Gracias

Yo lo hago asi, pero no es exactamente un count: (la sintaxis puede cambiar ligeramente, hace tiempo que no uso Oracle y esto es de postgres)

select sum(CASE WHEN condicion1 THEN 1 ELSE 0 END) as contador_condicion1,
sum(CASE WHEN condicion2 THEN 1 ELSE 0 END) as contador_condicion2
....
  #8 (permalink)  
Antiguo 22/04/2012, 16:37
 
Fecha de Ingreso: mayo-2007
Mensajes: 3
Antigüedad: 17 años
Puntos: 0
Respuesta: ¿Se puede en Oracle en un select poner dos count con distinto where?

saludos quisiera saber como puedo poner dos count que me den datos de una misma tabla pongo el ejemplo que tal como lo tengo me da los valores pero se repiten ósea ejemplo columna 1 tengo valor total 5 y columna 2 me debería de dar otro valor pero pone el mismo 5 de la columna 1

SELECT
id,

fecha,

mes,

edad_ninez,

sexo_ninez,

tipo_violencia_fisica_ninez,

tipo_violencia_psicologica_ninez,

COUNT(tipo_violencia_fisica_ninez) AS totalVfisica,

COUNT(tipo_violencia_psicologica_ninez) AS totalSicplogica

FROM clinica_atencion_integral

WHERE (tipo_violencia_fisica_ninez = 'si') AND (tipo_violencia_psicologica_ninez = 'si')


GROUP BY mes
ORDER BY mes DESC


esto es ejemplo de lo que saca

mes totalVfisica totalSicplogica
enero 2 2
febrero 4 4
marzo 8 8
.
.



agradezco su ayuda pues he buscado y buscado y no encuentro respuesta más que para hacer esto pero para dos tablas y yo tengo los campos en una sola tabla.
gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 00:30.