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

que hacer cuando Count(*) No funciona como esperamos?

Estas en el tema de que hacer cuando Count(*) No funciona como esperamos? en el foro de Mysql en Foros del Web. Hola Buan dia a tod@s espero puedan ayudarme tengo una consulta que su funcionalidad seria traerme el resultado de cuantos registros cumplen con ciertas condiciones ...
  #1 (permalink)  
Antiguo 17/12/2013, 11:30
 
Fecha de Ingreso: julio-2005
Mensajes: 73
Antigüedad: 18 años, 9 meses
Puntos: 0
Pregunta que hacer cuando Count(*) No funciona como esperamos?

Hola Buan dia a tod@s espero puedan ayudarme tengo una consulta que su funcionalidad seria traerme el resultado de cuantos registros cumplen con ciertas condiciones y la fecha en la que lo cumplen. bien esto seria de la siguiente forma.
Cita:
Editado: Código de programación no permitido en foros de Bases de Datos. Leer las normas, por favor.
Código MySQL:
Ver original
  1. SELECT evento,COUNT(*) FROM abortos_server
  2. WHERE site_id = " . $sitio . " and YEAR(evento) = " . $anos . AND semana = " . $semana


Código MySQL:
Ver original
  1. INSERT INTO abortoprom (abortos, site_id, evento, semana)
  2. VALUES ('$res[1] . "','" . $sitio . "','" . $res[0] . "','" . $semana . "')
esta consulta extrae inofmracion de una tabla general de eventos que lo unico que contiene es:

Código:
site_id  |  evento  | semana
----------------------------------------

24 | 2011-01-02 | 52
22 | 2011-01-18 | 3
22 | 2011-01-18 | 3
21 | 2011-01-20 | 3
22 | 2011-01-20 | 3
y asi sucesivamente.. en esta tabla me guarda los eventos de aborto que pueden ocurrir.. ahora bn me interesa sacar cuantos abortos hay en un sitio, año y semana determinada esto para guardarlo en una segunda tabla.

me interesa obtener un resultado similar a este

Código:
abortos | site_id | evento | semana 
-------------------------------
0 | 22 | 2011-01-18 | 2
3 | 22 | 2011-01-19 | 3
pero la funcion count(*) me devuelve 0 si no hay nada pero la fecha evento me la devuelve en NULL

como puedo obtener ese dato si alguien me puede ayudar de antemano muchas gracias.

Última edición por gnzsoloyo; 17/12/2013 a las 11:44
  #2 (permalink)  
Antiguo 17/12/2013, 11:50
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: que hacer cuando Count(*) No funciona como esperamos?

Cita:
pero la funcion count(*) me devuelve 0 si no hay nada pero la fecha evento me la devuelve en NULL
Porque el SQL no puede devolver el dato que no existe, cuando no está representado en ninguna tabla. Así de sencillo.
El SQL trabaja con los datos registrados en la tabla en forma real. No puede darte, tomados sólo de esa tabla, un valor cero (0), porque no tiene cómo encontrarlo.
Distinto sería se tienes una tabla donde aparezca la lista de sitios, entonces la cosa se simplifica:

Código MySQL:
Ver original
  1. SELECT S.site_id, E.evento, COUNT(*) Subtotal
  2. FROM sitios S LEFT JOIN abortos_server E ON S.site_id = E.site_id
  3.     (YEAR(E.evento) = ".$anos." AND E.semana = ".$semana")
  4.     OR E.site_id IS NULL
  5. GROUP BY  S.site_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; 17/12/2013 a las 12:55
  #3 (permalink)  
Antiguo 17/12/2013, 12:31
 
Fecha de Ingreso: julio-2005
Mensajes: 73
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: que hacer cuando Count(*) No funciona como esperamos?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Porque el SQL no puede devolver el dato que no existe, cuando no está representado en ninguna tabla. Así de sencillo.
El SQL trabaja con los datos registrados en la tabla en forma real. No puede darte, tomados sólo de esa tabla, un valor cero (0), porque no tiene cómo encontrarlo.
Distinto sería se tienes una tabla donde aparezca la lista de sitios, entonces la cosa se simplifica:

Código MySQL:
Ver original
  1. SELECT S.site_id, E.evento, COUNT(*) Subtotal
  2. FROM sitios S LEFT JOIN abortos_server E ON S.site_id = E.site_id
  3.     (YEAR(E.evento) = ".$anos." AND E.semana = " . $semana)
  4.    OR E.site_id IS NULL
  5. GROUP BY  S.site_id


Muchas gracias por tu respuesta te comento que si tengo una tabla sitios y se podria hacer tu consulta como me la mandas pero no me da el resultado deseado.

es decir mira.. en el año hay 52 semanas, en cada semana puedo o no haber el evento aborto.

quiero hacer una consulta que me traiga los valores de cada sitio, de las 52 semanas si hubo o abortos.

es decir.

si hago la consulta de esta manera( y funcionara)

Cita:
Editado: Código de programación no permitido en foros de Bases de Datos. Leer las normas, por favor.
Código MySQL:
Ver original
  1. SELECT evento,COUNT(*) FROM abortos_server
  2. WHERE site_id = 20 and YEAR(evento) = 2013
el resultado deseado seria listando todas las semanas incluyendo valores 0
Código:
sitio | evento | abortos | semana
------------------------------------------
20    | aqui la fecha | 0 | 1
20 | ---| 1 |2
20 | --- | 0 | 3
20 | --- | 1 |4
20 | --- | 0 | 5
20 | ---  | 0 | 6
entiendo que mysql no puede inventar datos que no existen, gracias sigo aprendiendo.. pero cual seria o como seria la consulta para que me arrojara ese resultado.

Última edición por gnzsoloyo; 17/12/2013 a las 12:49
  #4 (permalink)  
Antiguo 17/12/2013, 12: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: que hacer cuando Count(*) No funciona como esperamos?

Cita:
entiendo que mysql no puede inventar datos que no existen, gracias sigo aprendiendo.. pero cual seria o como seria la consulta para que me arrojara ese resultado.
Vamos a ver si terminas de entender lo que tu mismo estás respondiéndote:
Primero:
Cita:
entiendo que mysql no puede inventar datos que no existen
Segundo:
Cita:
pero cual seria o como seria la consulta para que me arrojara ese resultado
¿Que se puede deducir de tu propio comentario?

Simple: NO, NO SE PUEDE HACER.

Al menos no es posible sin una tabla de "semanas", donde aparezcan TODAS las semanas del año, y como eso no lo tienes, la respuesta es simplísima: No existe un modo de hacerlo en una consulta.

¿Cómo se hace eso, entonces, en los reportes que encuentras en algunas web?

Muy, pero muy fácil. Cualquier desarrollador lo sabe: Creas registros ficticios en la pagina, por medio de programación, donde poner valores cero para todas aquellas semanas donde no encuentras datos.
Básicamente es rellenar los "vacios" de datos en la tabla de la pagina web, pero no en la base de datos.
Yo lo he hecho muchísimas veces...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 18/12/2013, 01:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: que hacer cuando Count(*) No funciona como esperamos?

Por otro lado el dato semana es ineficiente guardarlo puesto que tienes

WEEK(fecha[, mode])


Código MySQL:
Ver original
  1. SELECT S.site_id, E.evento, WEEK(E.evento) semana, COUNT(*) Subtotal
  2. FROM sitios S LEFT JOIN abortos_server E ON S.site_id = E.site_id
  3.     (YEAR(E.evento) = ".$anos." AND WEEK(E.evento) = " . $semana.")
  4.     OR E.site_id IS NULL
  5. GROUP BY  S.site_id


que te retorna el ordinal de la semana, del mode no hace falta que te preocupes si la configuración del servidor es la tuya.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: php+mysql
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 06:02.