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

problema con consulta de promedio

Estas en el tema de problema con consulta de promedio en el foro de Mysql en Foros del Web. bueno lo que pasa es que tengo las siguientes tablas: Pedidos-----> idPedido int(11) idVendedor int(11) fecha_crea(date) Vendedores------> idVendedor int(11) nombre varchar(40) lo que necesito saber ...
  #1 (permalink)  
Antiguo 21/07/2011, 13:27
 
Fecha de Ingreso: junio-2011
Ubicación: Medellin-Antioquia-Colombia
Mensajes: 13
Antigüedad: 12 años, 9 meses
Puntos: 1
problema con consulta de promedio

bueno lo que pasa es que tengo las siguientes tablas:

Pedidos----->
idPedido int(11)
idVendedor int(11)
fecha_crea(date)

Vendedores------>
idVendedor int(11)
nombre varchar(40)

lo que necesito saber es el promedio de pedidos tomados por un vendedor durante determinado intervalo de tiempo teniendo en cuenta el total de pedidos en ese intervalo de tiempos. tengo la consulta para tomar el total de ventas hechas en ese intervalo de tiempo, pero tengo problemas con la instrucción count y avg.

agradezco de antemano cualquier ayuda que me puedan prestar.

Adjunto la sentencia que tengo:
Código MySQL:
Ver original
  1. SELECT p.idPedido, ven.nombre FROM pedidos AS p, vendedores AS ven WHERE p.idVendedor=ven.idVendedor AND p.fecha_crea > '2011-06-01 00:00:00' AND p.fecha_crea < '2011-06-30 00:00:00'
  #2 (permalink)  
Antiguo 21/07/2011, 13:47
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, 4 meses
Puntos: 2658
Respuesta: problema con consulta de promedio

Lo primero que debes definir es el promedio de qué periodo estás hablando, porque eso no lo estás haciendo bien.
Me explico. Dices:
Cita:
promedio de pedidos tomados por un vendedor durante determinado intervalo de tiempo teniendo en cuenta el total de pedidos en ese intervalo de tiempos
Según eso, no hay un promedio, porque estás tomando todo el período como una unidad de tiempo. Habría promedio si nos planteases un nivel de desagregación que permitiese calcular un subtotal, pero no lo haces.
La idea sería, por ejemplo, que nos dijeses "el promedio diario" o el "promedio semanal", algo que nos sirviese para hacer el calculo, pero cuando tomas el período entero como una unidad, la media es 1, porque se promedia el total de ventas sobre... el total de ventas...
¿Se entiende?

Buen, ¿qué desagregación quieres? ¿diaria? Sería algo así:
Código MySQL:
Ver original
  1.     nombre,
  2.     idVendedor,
  3.     AVG(TotalVentas) MediaDeVentas
  4.   (SELECT
  5.     p.idVendedor,
  6.     ven.nombre,
  7.     COUNT(*) TotalVentas
  8.   FROM pedidos p INNER JOIN vendedores ven ON p.idVendedor=ven.idVendedor
  9.   WHERE DATE(p.fecha_crea) BETWEEN (DATE'2011-06-01 00:00:00') AND DATE('2011-06-30 00:00:00')
  10.   GROUP BY ven.idVendedor, DATE(p.fecha_crea)) T1
  11. GROUP BY idVendedor;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/07/2011, 14:05
 
Fecha de Ingreso: junio-2011
Ubicación: Medellin-Antioquia-Colombia
Mensajes: 13
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: problema con consulta de promedio

CORRIJO!

me he confundido, no debo hallar el promedio, sino el porcentaje que ocupan las ventas de un vendedor especifico con respecto al total de venta, en un determinado intervalo de tiempo(pretendo que sea mensual).

Adjunto una consulta que elabore:
Código MySQL:
Ver original
  1. (SELECT COUNT(p1.idPedido) FROM pedidos AS p1, vendedores AS ven2 WHERE p1.fecha_crea > '2011-06-01 00:00:00' AND p1.fecha_crea < '2011-06-30 00:00:00' AND p1.idVendedor=ven2.idVendedor) as t,
  2. (SELECT COUNT(p2.idPedido) FROM pedidos AS p2, vendedores AS ven1 WHERE p2.fecha_crea > '2011-06-01 00:00:00' AND p2.fecha_crea < '2011-06-30 00:00:00' AND ven1.idVendedor=4 AND p2.idVendedor=4) AS tv,
  3. (tv * 100.0 / t )AS porcentaje,
  4. ven.nombre
  5. pedidos AS p3, vendedores AS ven WHERE p3.fecha_crea > '2011-06-01 00:00:00' AND p3.fecha_crea < '2011-06-30 00:00:00' AND p3.idVendedor=4 AND ven.idVendedor=4

al ejecutarla me marca un error, justo en la parte que pretendo hacer el calculo porcentual, me dice que la columna columna 'tv' no existe.
  #4 (permalink)  
Antiguo 21/07/2011, 19:59
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, 4 meses
Puntos: 2658
Respuesta: problema con consulta de promedio

Veamos los consejos básicos:
- No hagas subconsultas en los campos del SELECT si puedes evitarlo, no sólo harán la consulta más lenta, sino que además, si vas a usar las mismas condiciones en ellas y en el FROM, carece de sentido. para eso las pones en una tabla derivada
- Si estás buscando un rango de fechas, no uses DATETIMEs, usa DATEs, y usa BETWEEN en lo posible. Lo que pones de consulta fuerza a una conversión entre DATE y DATETIME, y usa bytes innecesariamente para las fechas del rango.
- No pongas la relación en el WHERE y no uses la coma para el JOIN. Los manuales lo ponen de ejemplo, pero es mucho más eficiente usar INNER JOIN y poner "ON valor = valor", ya que el FROM es optimizable por el parser y el WHERE no.
- El error de columna desconocida se da porque no puedes usar el alias creado en los campos del SELECT como nombre de campo en el mismo SELECT. Sólo puedes hacerlo si ese campo proviene de una subconsulta en el FROM. Tampoco se pueden usar en el WHERE los alias de las columnas del SELECT.
- Si estás iniciándote recién en SQL, no trates de hacer consultas extremadamente complicadas. Ya habrá tiempo para ello. Antes es preferible resolver cosas en la aplicación y no en la base, hasta que vayas adquiriendo pericia.
- Si usas un campo de relación entre dos tablas de modo que el valor sea el mismo (ejemplo: p1.idVendedor = ven2.idVendedor), no necesitas comparar contra ambos campos un valor dado. Es redundante, porque de como sólo devolverá los que coincidan entre tablas, basta con indicarlo sobre una de ellas.

La consulta en general que planteaste es demasiado complicada. Hazlo más simple. Tal vez algo así:

Código MySQL:
Ver original
  1.     nombre,
  2.     idVendedor,
  3.     ((SubVentas * totalVentas)/100) PorcDeVentas
  4.   (SELECT
  5.     p.idVendedor,
  6.     ven.nombre,
  7.     COUNT(p.idPedido) SubVentas,
  8.     T2.totalVentas
  9.   FROM
  10.     pedidos p
  11.     INNER JOIN
  12.     vendedores ven ON p.idVendedor=ven.idVendedor
  13.     JOIN
  14.     (SELECT COUNT(idPedido) totalVentas FROM pedidos WHERE DATE(p.fecha_crea) BETWEEN '2011-06-01' AND '2011-06-30') T2
  15.   WHERE DATE(p.fecha_crea) BETWEEN '2011-06-01' AND '2011-06-30'
  16.   AND ven1.idVendedor=4
  17.   GROUP BY ven.idVendedor) T1;
(yo lo haría más simple aún, pero te resultaría algo complicado si no conoces las variables de usuario de MySQL)
Por sobre todas las cosas: Trata de mantenerlo simple.
__________________
¿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 22/07/2011, 07:34
 
Fecha de Ingreso: junio-2011
Ubicación: Medellin-Antioquia-Colombia
Mensajes: 13
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: problema con consulta de promedio

Muchas gracias gnzsoloyo, tendré en cuenta todos tus concejos, la verdad es que ando muy nuevo en esto de las consultas en mysql, me serán muy útiles tus concejos

Etiquetas: promedio, 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 16:10.