Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Promedio de campo calculado con una sub-consulta (https://www.clubdelphi.com/foros/showthread.php?t=24655)

ContraVeneno 29-08-2005 20:41:58

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.

Crandel 09-09-2005 07:13:04

provaste hacer una suma de la diferencia dividido por la cantidad (promedio)
agrupada por Tipo?

ContraVeneno 09-09-2005 16:17:16

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. :D
No se si el método de la tabla temporal sea el más adeacudo, pero ha funcionado bien.

Crandel 09-09-2005 18:18:18

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

ContraVeneno 09-09-2005 18:25:22

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.

Crandel 09-09-2005 18:49:14

entonces ya lo tenes resuelto con la tabla temporal?

La otra forma de hacerlo es creando un ciclo for.

ContraVeneno 09-09-2005 20:48:44

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.

vtdeleon 09-09-2005 21:02:55

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.:rolleyes:
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

ContraVeneno 06-10-2005 16:38:06

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.


La franja horaria es GMT +2. Ahora son las 14:55:32.

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