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

Count con condiciones

Estas en el tema de Count con condiciones en el foro de Bases de Datos General en Foros del Web. Hola, estoy en un problema por mis escasos conocimientos de lenguaje SQL El tema es asi Tengo dos tablas: usuarios y tareas Usuarios tiene estos ...
  #1 (permalink)  
Antiguo 05/07/2005, 15:40
 
Fecha de Ingreso: febrero-2003
Mensajes: 141
Antigüedad: 21 años, 2 meses
Puntos: 0
Count con condiciones

Hola, estoy en un problema por mis escasos conocimientos de lenguaje SQL
El tema es asi
Tengo dos tablas: usuarios y tareas
Usuarios tiene estos campos:

usuario_id
nombre


Tareas tiene estos campos:

tarea_id
usuario_id
estado


Un usuario puede tener varias tareas y esas tareas tendran en su campo estado alguno de estos tres valores: A , P o F

Yo quiero generar una consulta Que tenga a USUARIOS como tabla principal y a TAREAS como tabla relacionada y que me muestre cuantas TAREAS con A, cuantas TAREAS con P y cuantas TAREAS con F tiene cada usuario.
Es posible?, si es si, como?
Muchas gracias
Shaka
  #2 (permalink)  
Antiguo 05/07/2005, 15:57
Avatar de haron  
Fecha de Ingreso: febrero-2004
Ubicación: Cádiz (refinitivo)
Mensajes: 632
Antigüedad: 20 años, 2 meses
Puntos: 3
yo lo haria asi:
Código:
select
  u.usuario_id,
  u.nombre,
  sum(if (t.estado = 'A', 1, 0)) as cuantas_A,
  sum(if (t.estado = 'P', 1, 0)) as cuantas_P,
  sum(if (t.estado = 'F', 1, 0)) as cuantas_F
from usuarios u
left join tareas t on t.usuario_id = u.usuario_id
group by u.usuario_id
__________________
Si ocurre algo importante, estamos afuera fumándonos unos cigarritos.
  #3 (permalink)  
Antiguo 06/07/2005, 01:01
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Es más simple que eso:
Código:
select usuarios.usuario_id, estado, count(*)
from usuarios join tareas on usuarios.usuarios_id = tareas.usuarios_id
group by 1,2
Un saludo.
__________________
Estoy contagiado de Generación-I
  #4 (permalink)  
Antiguo 06/07/2005, 04:44
Avatar de haron  
Fecha de Ingreso: febrero-2004
Ubicación: Cádiz (refinitivo)
Mensajes: 632
Antigüedad: 20 años, 2 meses
Puntos: 3
pues es verdad! en que estaria pensando...

la otra sentencia esta bien cuando las condiciones son complicadas. puedes poner un sum(if(<condicion_cualquiera>, 1, 0)). pero en este caso es mucho mejor la otra solucion.
__________________
Si ocurre algo importante, estamos afuera fumándonos unos cigarritos.
  #5 (permalink)  
Antiguo 06/07/2005, 05:21
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
La diferencia está en que la solución de Haron devuelve todo en una fila, la que puse yo en tantas como posibles estados.
¿ventajas e inconvenientes?. Pues la de Haron es dependiente del número de posibles valores que pueda tener estado y por cada nuevo valor hay que modificar la instrucción select para tenerlo en cuenta. La que puse yo es independiente del número de estados pero, dependiendo de como quieras mostrar los datos, te puede dar un poco más de trabajo de programación.
Un saludo.
__________________
Estoy contagiado de Generación-I
  #6 (permalink)  
Antiguo 06/07/2005, 05:43
 
Fecha de Ingreso: febrero-2003
Mensajes: 141
Antigüedad: 21 años, 2 meses
Puntos: 0
Agradezco la ayuda brindada a todos, la primera opcion con el if me parecio la mas acertada aunque aun no puedo hacerla funcionar
La opcion de VICE no me es util porque no me daria el resultado en la forma que espero.

Yo necesito que el sistema entregue:

Usuario_id | Nombre | cant_A | cant_P | cant_F
152 Pepe 0 2 1
256 Luis 1 0 3
La segunda opcion a golpe de vista no devuelve la tabla en el formato anterior
Espero con su ayuda encontrar una solucion a esto
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




La zona horaria es GMT -6. Ahora son las 03:58.