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

duda con count

Estas en el tema de duda con count en el foro de Mysql en Foros del Web. Hola tengo 3 tablas empresa, usuario: 1 usuario puede estar en varias empresas reporte: 1 reporte tiene un usuario, y los reportes pueden estar activos, ...
  #1 (permalink)  
Antiguo 30/05/2013, 04:54
 
Fecha de Ingreso: febrero-2010
Ubicación: La Habana,Cuba
Mensajes: 89
Antigüedad: 14 años, 2 meses
Puntos: 1
duda con count

Hola tengo 3 tablas
empresa,
usuario: 1 usuario puede estar en varias empresas
reporte: 1 reporte tiene un usuario, y los reportes pueden estar activos, cerrados..
Por transitividad 1 reporte pertenece a una empresa

Lo que deseo es obtener una lista con todas las empresas, pero que al lado de cada empresa me salga la cantidad de reportes activos por cada una. Logro algo pero hay empresas que no tienen reportes activos y no me salen en la lista. Este es el codigo que tengo

Código:
select empresa.empresa, count(reporte.estado)
from empresa
left join usuario on usuario.fk_empresa_id = empresa.empresa_id
left join reporte on reporte.fk_usuario_reporta_id = usuario.usuario_id
where reporte.estado='activa'
group by empresa.empresa_id

Última edición por miche23; 30/05/2013 a las 05:06
  #2 (permalink)  
Antiguo 30/05/2013, 06:03
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 16 años, 5 meses
Puntos: 51
Respuesta: duda con count

Elimina where reporte.estado='activa'

Saludos
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #3 (permalink)  
Antiguo 30/05/2013, 06:28
 
Fecha de Ingreso: febrero-2010
Ubicación: La Habana,Cuba
Mensajes: 89
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: duda con count

Lynxcraft
sucede que quizas no me explique bien pero si quito el where entonces no hace la funcion el count porque yo quiero que al lado de las empresas me salga el total de los reportes activos por cada una, aunque aparezcan empresas que no tengan reportes activos. Espero haberme hecho entender esta vez
  #4 (permalink)  
Antiguo 30/05/2013, 07:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: duda con count

Prueba:
Código MySQL:
Ver original
  1. SELECT   E.empresa, COUNT (R.estado)
  2.     FROM empresa E
  3.          LEFT JOIN usuario U ON E.empresa_id = U.fk_empresa_id
  4.          LEFT JOIN reporte R ON U.usuario_id = R.fk_usuario_reporta_id
  5.    WHERE R.estado = 'activa' OR U.fk_empresa_id IS NULL OR R.fk_usuario_reporta_id IS NULL
  6. GROUP BY E.empresa_id
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 30/05/2013 a las 07:27
  #5 (permalink)  
Antiguo 30/05/2013, 07:20
 
Fecha de Ingreso: agosto-2003
Mensajes: 174
Antigüedad: 20 años, 8 meses
Puntos: 3
Respuesta: duda con count

Código MySQL:
Ver original
  1. select count(R.estado) as cantidad
  2. from empresa E
  3. left join usuario U on E.empresa_id=U.fk_empresa_id
  4. left join reporte R on U.usuario_id=R.fk_usuario_reporte_id
  5. where R.estado='activa'
  6. group by empresa;
Creo que es así.
Primero reunes toda la información que quieres en una fila y luego haces un group by empresa para que te saque un registro por empresa. Lo que haces en cada registro es count(reporte.estado) y ahí solo salen los activos porque tienes puesto el where R.estado='activo'

Última edición por gnzsoloyo; 30/05/2013 a las 07:26
  #6 (permalink)  
Antiguo 30/05/2013, 07:40
 
Fecha de Ingreso: febrero-2010
Ubicación: La Habana,Cuba
Mensajes: 89
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: duda con count

Gedeon: la consulta que pones aqui es la misma que tengo yo, y esa definitivamente me da las empresas que solo tienen reportes activos. Lo que deseo es ver todas las empresas y de esa lista las qu etengan reportes activos me muetre cuantas tiene seria algo asi:
e1---5activos
e2---6activos
e3---0activos
Pero en esta consulta no sale la e3 por no tener reportes activos (pero yo necesito que salga esa empresa aunque no tenga activos)


gnzsoloyo: tu consulta me ha resultado no del todo porque faltan empresas por aparecer pero estoy tratando de hacer algunos cambios para que me funcione al 100% cualquier cosa lo posteo aca. Tenia una idea de una subconsulta pero aun no me sale nada en concreto

gracias a los dos , seguire intentando.
  #7 (permalink)  
Antiguo 30/05/2013, 07:59
 
Fecha de Ingreso: febrero-2010
Ubicación: La Habana,Cuba
Mensajes: 89
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: duda con count

gnzsoloyo: son interesantes los resultados, solo me aparecen las activas (que las cuenta bien), las que tienen reportes activos (pone NULL, eso esta bien para mi), pero no me cuneta las de reportes pendientes..
Sabes que puede ser esto?
  #8 (permalink)  
Antiguo 30/05/2013, 08:38
 
Fecha de Ingreso: agosto-2003
Mensajes: 174
Antigüedad: 20 años, 8 meses
Puntos: 3
Respuesta: duda con count

Cita:
Pero en esta consulta no sale la e3 por no tener reportes activos
si tu hiciste un left join de empresas a usuarios y de usuarios a reportes lo que tienes a la izquierda sale todo osea que salen todas las empresas. Otra cosa sería si pusieras inner join osea que no puede pasar que la emprea e3 no salga si pusiste empresas a la izquierda.
  #9 (permalink)  
Antiguo 30/05/2013, 08:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: duda con count

Cita:
pero no me cuneta las de reportes pendientes..
Sabes que puede ser esto?
Los reportes pendientes no están contemplados en las condiciones que pones.
La restricción que incluyes es:
Código MySQL:
Ver original
  1. WHERE R.estado='activa'
Para que incluya los pendientes, debes ponerlo como condición probable:

Código MySQL:
Ver original
  1. WHERE R.estado IN('activa', 'pendiente')
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 30/05/2013, 09:16
 
Fecha de Ingreso: febrero-2010
Ubicación: La Habana,Cuba
Mensajes: 89
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: duda con count

Gedeon: por increible que parezca no salen todas las empresas con LEFT JOIN

gnzsoloyo: quizas me exprese mal pero mi objetivo es que salga count para las activas pero tambien quiero que salgan las pendientes y cerradas pero esas dos ultimas que no las cuente (count) te pongo un ejemplo para explicarme mejor.

empresa-----estado-----count(estado)
e1-------------activa------5
e2-------------activa------12
e3-------------pendiente-NULL o nada
e4-------------activa------23
e5-------------cerrada----NULL o nada
Com ves en este ejemplo a pesar de que hay estados pendientes o cerrados estos no se cunetas, solo se cuentan las activas.
En la consulta que me envias se ve muy similar al ejemplo pero me falta en esa consulta que aparezca la e3 que esta en estado pendiente, sin embargo salen todas las demas , incluso la e5 que esta cerrada y pone en count lo mismo que te pogno aqui NULL.

Como ves lo que necesito es que ver todas las empresas pero que solo salga la cantidad de activas de la que tenga activa.
Imaginate un gestor de correos que pone todas las carpetas pero solo poner al lado el numero de emials que estan sin leer, algo asi.
  #11 (permalink)  
Antiguo 30/05/2013, 09:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: duda con count

Cita:
empresa-----estado-----count(estado)
e1-------------activa------5
e2-------------activa------12
e3-------------pendiente-NULL o nada
e4-------------activa------23
e5-------------cerrada----NULL o nada
Para esto no alcanza con que se agrupe por empresa, sino que debe agregarse el estado, y eliminarse la condición.
Código MySQL:
Ver original
  1. SELECT   E.empresa, IFNULL(R.estado, '') estado, COUNT (R.estado)
  2.     FROM empresa E
  3.          LEFT JOIN usuario U ON E.empresa_id = U.fk_empresa_id
  4.          LEFT JOIN reporte R ON U.usuario_id = R.fk_usuario_reporta_id
  5.    WHERE TRUE OR U.fk_empresa_id IS NULL OR R.fk_usuario_reporta_id IS NULL
  6. GROUP BY E.empresa_id, R.estado
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 11/09/2013, 09:58
 
Fecha de Ingreso: febrero-2010
Ubicación: La Habana,Cuba
Mensajes: 89
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: duda con count

Gedeon: la consulta que pones aqui es la misma que tengo yo, y esa definitivamente me da las empresas que solo tienen reportes activos. Lo que deseo es ver todas las empresas y de esa lista las qu etengan reportes activos me muetre cuantas tiene seria algo asi:
e1---5activos
e2---6activos
e3---0activos
Pero en esta consulta no sale la e3 por no tener reportes activos (pero yo necesito que salga esa empresa aunque no tenga activos)


gnzsoloyo: tu consulta me ha resultado no del todo porque faltan empresas por aparecer pero estoy tratando de hacer algunos cambios para que me funcione al 100% cualquier cosa lo posteo aca. Tenia una idea de una subconsulta pero aun no me sale nada en concreto

gracias a los dos , seguire intentando.
  #13 (permalink)  
Antiguo 11/09/2013, 16:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: duda con count

Intenta con algo así (no lo he probado). Solo he añadido subconsulta a la consulta de @gnzsoloyo y unido con LEFT JOIN para tratar de obtener todas las empresas. El filtrado de datos quizás hace necesaria la subconsulta.
Código MySQL:
Ver original
  1. SELECT em.empresa, T1.estado, IFNULL(T1.cuenta,'') cuenta FROM empresa em LEFT JOIN (SELECT  E.empresa, IFNULL(R.estado, '') estado, COUNT (R.estado) cuenta, empresa_id
  2.         FROM empresa E
  3.              LEFT JOIN usuario U ON E.empresa_id = U.fk_empresa_id
  4.              LEFT JOIN reporte R ON U.usuario_id = R.fk_usuario_reporta_id
  5.        WHERE TRUE OR U.fk_empresa_id IS NULL OR R.fk_usuario_reporta_id IS NULL
  6.     GROUP BY E.empresa_id, R.estado)T1 ON em.empresa_id = T1.empresa_id GROUP BY em.empresa_id, T1.estado

Última edición por jurena; 11/09/2013 a las 16:46

Etiquetas: count, join, select, tabla
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 05:17.