Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Oracle (http://www.forosdelweb.com/f100/)
-   -   ¿Se puede en Oracle en un select poner dos count con distinto where? (http://www.forosdelweb.com/f100/puede-oracle-select-poner-dos-count-con-distinto-where-556284/)

programadornet 12/02/2008 10:06

¿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

programadornet 12/02/2008 10:11

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.

Osirapis 05/03/2008 10:44

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.

pukas 14/03/2008 04:43

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

Osirapis 19/03/2008 07:43

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

pukas 24/03/2008 02:47

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

seyko 24/03/2008 08:37

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

Iniciado por programadornet (Mensaje 2282442)
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
....

herreraarmando 22/04/2012 16:37

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


La zona horaria es GMT -6. Ahora son las 06:26.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.