Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Post Promedio de campo calculado con una sub-consulta

Saludos a todos, trataré de dar una explicación para luego hacer la pregunta.
tengo la siguiente tabla "Hist":
Código:
Tipo Fecha			SiguienteVisita
--------------------------------------
A	 2005-01-21	 2005-02-21
A	 2005-02-25	 2005-03-25
B	 2005-03-26	 2005-04-26
A	 2005-04-30	 2005-05-30
Para conocer el retraso que tiene en cada visita, hago lo siguiente (comparar la Siguiente Visita de la anterior con la Fecha cuando vino):
Código SQL [-]
select A.Tipo, datediff(dd,(select top 1 H.SiguienteVisita
from Hist H
where H.fecha_<_A.Fecha) , A.Fecha) as Retraso
from Hist A
Que me da el siguiente resultado:
Código:
Tipo Retraso
---------------
A	 NULL 
A	 4
B	 1
A	 4
Lo que es necesario obtener de estos datos, es el promedio de retraso de cada tipo, es decir:
Código:
Tipo PromedioRetraso
---------------
A	 2.66 
B	 1
intenté utilizar AVG() agrupando por Tipo de esta forma: AVG(Retraso) pero me marca que "Retraso no es un campo válido".
Luego intenté AVG(datediff(dd,...,...)) pero me dice que no puedo utilizar la función AVG cuando se encuentra una sub-query.

¿Alguna sugerencia sobre como obtener el promedio de un campo que estoy calculando con una sub-consulta?


--------- Editado -------
Lo solucioné utilizando una tabla temporal. De cualquier manera:Cualquier sugerencia, idea o recomendación será bienvenida.
__________________


Última edición por ContraVeneno fecha: 30-08-2005 a las 19:36:12. Razón: Solucionado
Responder Con Cita
  #2  
Antiguo 09-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
provaste hacer una suma de la diferencia dividido por la cantidad (promedio)
agrupada por Tipo?
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 09-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Grax por responder Crandel, pero obtengo el mismo problema al tratar de hacer la suma que al tratar de sacar el promedio. Me dice que no lo puedo hacer cuando existe una sub-query.

De cualquier manera, Gracias por responder.
No se si el método de la tabla temporal sea el más adeacudo, pero ha funcionado bien.
__________________


Última edición por ContraVeneno fecha: 09-09-2005 a las 17:20:30.
Responder Con Cita
  #4  
Antiguo 09-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
no entiendo porque haces la subconsulta adentro creo que debería funcionar igual haciendolo afuera, asi:

Código SQL [-]
SELECT Tipo, SUM(SiguienteVisita - Fecha)/count(Fecha)
  FROM HIST
  group by Tipo
__________________
[Crandel]
Responder Con Cita
  #5  
Antiguo 09-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
es que la resta no se hace con el campo "SiguienteVisita" del mismo registro, sino con el campo "SiguienteVisita" del registro anterior comparado con la "Fecha" del Registro Actual. Es por eso que tengo que hacer la subConsulta, para que me de el valor de la "SiguienteVisita" del campo anterior al actual.
__________________

Responder Con Cita
  #6  
Antiguo 09-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
entonces ya lo tenes resuelto con la tabla temporal?

La otra forma de hacerlo es creando un ciclo for.
__________________
[Crandel]
Responder Con Cita
  #7  
Antiguo 09-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Cita:
Empezado por Crandel
entonces ya lo tenes resuelto con la tabla temporal?
Cita:
Empezado por Yo mismo, primer mensaje
--------- Editado -------
Lo solucioné utilizando una tabla temporal.
Así es Crandel, lo que hice fue mandar el resultado de los retrasos (consulta que me da el retraso) a una tabla temporal, y luego sobre esa tabla temporal utilizo la función AVG con un Group BY Tipo y lixto, obtengo el resultado que necesito.

Mi insistencia sobre alguna solución, era por ver si habría alguna otra idea más práctica que tener que utilizar la tabla temporal. De cualquier manera, gracias por tus respuestas.
__________________

Responder Con Cita
  #8  
Antiguo 09-09-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 23
vtdeleon Va por buen camino
Saludos
Cita:
Empezado por ContraVeneno
es que la resta no se hace con el campo "SiguienteVisita" del mismo registro, sino con el campo "SiguienteVisita" del registro anterior comparado con la "Fecha" del Registro Actual.
Con razon!!, no sabia de donde salian esos resultados del 1er post.
Código SQL [-]
 select Tipo, sum(retraso)/Count(tipo) 
 from (
    select A.Tipo, datediff(dd,(select top 1 H.SiguienteVisita
    from Hist H 
    where H.fecha_<_A.Fecha) , A.Fecha) as Retraso
     from Hist A
  )
Intenta esto a ver
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!

Última edición por vtdeleon fecha: 22-09-2005 a las 20:32:48.
Responder Con Cita
  #9  
Antiguo 06-10-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Por alguna extraña y bizarra situación, hoy me llego la notificación de tu respuesta amigo VTdeLeon, que curiosamente, es la misma forma de solucionarlo a como me propusiste el día de ayer en otro hilo.

Y si, con la forma que me propones funciona correctamente, con el detalle que ya conoces de que hay que agregarle un alias a parte del form, más un group by tipo para que me de el promedio de cada tipo.

Muchas Gracias nuevamente amigo VTdeLeon.
__________________

Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:38:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi