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

Problema con resumen por dias

Estas en el tema de Problema con resumen por dias en el foro de Mysql en Foros del Web. Os explico, tengo un tabla de registro de llamadas entrantes, tengo los campos: start: fecha y la hora de la llamada entrante phone: callerId del ...
  #1 (permalink)  
Antiguo 14/12/2008, 17:22
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 8 meses
Puntos: 0
Problema con resumen por dias

Os explico, tengo un tabla de registro de llamadas entrantes, tengo los campos:
  • start: fecha y la hora de la llamada entrante
  • phone: callerId del llamante
Posteriormente hago la siguiente consulta:
Código:
SELECT DATE_FORMAT(start,'%d/%m/%Y') AS Dia, (SELECT COUNT(DISTINCT phone) 
FROM cdrin) AS NewCli, COUNT(DISTINCT phone) AS Clientes, Count(phone) AS 
Llamadas FROM cdrin group by Dia
El resultado que me da es el siguiente:
Código:
       Dia 	      NewCli 	          Clientes        Llamadas
05/12/2008 	        171 	             30 	     53
06/12/2008 	        171 	             32 	     58
07/12/2008 	        171 	             36 	     91
08/12/2008 	        171 	             38 	     78
En NewCli quiero un contador de nuevos clientes que entren cada día, pero no me aclaro, 171 es el resultado de todos los clientes desde el inicio, pero me gustaría saber cuantos clientes nuevos se añaden cada día.

Espero haberme explicado.

Gracias.
  #2 (permalink)  
Antiguo 15/12/2008, 07:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Problema con resumen por dias

Para averiguar los nuevos clientes de los días donde se incorporaron nuevos clientes, yo intentaría esto:
Código sql:
Ver original
  1. SELECT COUNT( DISTINCT cd.phone ) NewCli, t1.primfecha fecha
  2. FROM cdrin cd
  3. INNER JOIN (
  4.  
  5. SELECT MIN(
  6. START) AS primfecha, phone
  7. FROM cdrin
  8. GROUP BY phone
  9. )t1 ON cd.phone = t1.phone
  10. AND cd.START = t1.primfecha
  11. GROUP BY START ORDER BY START

Última edición por jurena; 15/12/2008 a las 08:47
  #3 (permalink)  
Antiguo 15/12/2008, 15:48
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 8 meses
Puntos: 0
Respuesta: Problema con resumen por dias



Funciona perfecto, simplemente he añadido lo de DATE_FORMAT para que el resultado salga por días, pues de lo contrario lo agrupa también por tiempo, por lo que si no coinciden en el mismo segundo dos llamadas, la agrupación no es efectiva.
Código:
SELECT COUNT( DISTINCT cd.phone ) NewCli, DATE_FORMAT(t1.primfecha,'%d/%m/%Y') fecha 
FROM cdrin cd
INNER JOIN (
 
SELECT MIN( 
start) AS primfecha, phone
FROM cdrin
GROUP BY phone
)t1 ON cd.phone = t1.phone
AND cd.start = t1.primfecha
GROUP BY fecha ORDER BY fecha
Así de primeras te lo preguntaría todo acerca del código, porque apenas entiendo nada, pero antes de hacerlo voy a estudiar y tratar de resolver dentro de mi cabeza este código.

Muchas gracias.
  #4 (permalink)  
Antiguo 16/12/2008, 01:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Problema con resumen por dias

Explicación por si te ayuda a entenderlo mejor:
con esto
Código sql:
Ver original
  1. SELECT MIN(
  2. START) AS primfecha, phone
  3. FROM cdrin
  4. GROUP BY phone

busco la primera aparición de todas las llamadas, y lo hago agrupando por teléfono y buscando el mínimo de la fecha, es decir, la fecha más baja. Si lanzas esa consulta verás que sólo te muestra el phone y el start en el que un phone apareció por primera vez. Eso es el corazón de la consulta. Luego, a su alrededor, hago un inner join que une la tabla en sí con esa consulta, pero con dos claves para el cruce, la coincidencia de phone y de start. Puesto que ya he seleccionado los valores mínimos de fecha y agrupado tendré los valores de esos días y teléfono. Luego agrupo por start para poder contarlos y hago un count de los phone, procurando, eso sí, que no me cuente dos veces si alguien, el día que entró por primera vez, entró más de una vez, algo que consigo con DISTINCT. No estoy seguro de que todo funcione al 100%, pero es un primer acercamiento. Seguro que hay otras consultas para hacer esto, pero esta fue la que se me ocurrió.

Ah, en cuanto a start, pensé que se trataba de un campo DATE y no DATETIME. Tu solución con DATE_FORMAT es buena para resolver el problema de las horas minutos y segundos a la hora de agrupar por día.

Última edición por jurena; 16/12/2008 a las 01:45
  #5 (permalink)  
Antiguo 07/01/2009, 16:28
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 8 meses
Puntos: 0
Respuesta: Problema con resumen por dias

Muchas gracias Jurena, tras estar todas las navidades copiando el código en el phpmyadmin, ya lo he entendido, o al menos eso creo...

Comentarte que funciona al 100%, lo único que la consulta es muy pesada, con 3.800 registros, tarda cerca de 6 segundos, también tiene culpa que se ejecuta en un servidor muy justito.

Pues nada ya que hablo del servidor, como estoy muy contento de lo que tengo y lo que me cuesta, haré un poquito de spam. http://www.kemsirve.es/ tengo el más básico y para tener una base de datos mysql es perfecto, salvo que se necesiten consultas muy complejas.

Saludos.
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 22:28.