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

Promedio 2 campos

Estas en el tema de Promedio 2 campos en el foro de Mysql en Foros del Web. Hola gente como va ? Bueno este es mi problema tengo una tabla que tiene ademas de otros campos tiene estos dos cantidad y precio_com. ...
  #1 (permalink)  
Antiguo 09/04/2009, 12:52
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 17 años
Puntos: 0
Promedio 2 campos

Hola gente como va ?
Bueno este es mi problema

tengo una tabla que tiene ademas de otros campos tiene estos dos cantidad y precio_com. Entonces necesito sacar un promedio de la cantidad por el precio pero pasa que puede que algun registro tenga algo asi
Código HTML:
cantidad     precio_compra

1                        125
1                        125
2                        125
1                        65
1                        75


esto seria 640 / 6 porque tengo en cuenta que el tercer registro tiene 2 

si pongo
Código HTML:
select avg(precio_compra) as precio from det_com_venta where codpro = 1 order by codventa desc limit 10
me da 103 pero verdadero promedio es 106.66
entonces prove esto

Código HTML:
select avg(precio_compra * cantidad) as precio from det_com_venta where codpro = 1 order by codventa desc limit 10
pero me da 128

entonces probe esto

Código HTML:
select avg(sum(precio_com) * sum(cantidad)) as precio from det_com_venta where codpro = 1 order by codventa desc limit 10
y esto me dice
Invalid use of group by function



Bueno espero puedan ayudarme
Muchas gracias

Última edición por matiasdagatti; 09/04/2009 a las 13:23 Razón: Falta parte de las consultas
  #2 (permalink)  
Antiguo 09/04/2009, 13:11
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Promedio 2 campos

Esto te genera el resultado que quieres, sin embargo, no se si te sirva para todo el conjunto de datos.

Código mysql:
Ver original
  1. select (sum(precio_compra*cantidad) / sum(cantidad)) as promedio from det_com_venta;

Un saludo y espero te sirva.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/04/2009, 13:29
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 17 años
Puntos: 0
Respuesta: Promedio 2 campos

Fijate que modifique las consultas, pido perdon porque se me paso. De todas formas tu respuesta me tira el siguiente siguiente resultado

Código:
SELECT (sum(precio_com*cantidad) / sum(cantidad)) as promedio FROM det_com_venta where codpro = 1 order by codventa limit 10
promedio = 6,66666
  #4 (permalink)  
Antiguo 09/04/2009, 13:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Promedio 2 campos

Ahora adicionaste un where y un limit 10. Es logico que te cambie el resultado.

Con el ejemplo que ingresaste en un principio cumple ese objeto.

sum(precio*cantidad) te devuelve un 640. El sum(cantidad) te devuelve el 6 que buscabas.

La división entre uno y el otro, da 106,6667.

Ahora te cambia por el where que ingresaste.

Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 09/04/2009, 13:46
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 17 años
Puntos: 0
Respuesta: Promedio 2 campos

Si entiendo y pido perdon por eso error pero sigo sin entender como hacerlo

la idea es sacar un promedio del precio de compra de un determinado producto vendido en las ultima 10 ventas
Gracias por tu ayuda
  #6 (permalink)  
Antiguo 09/04/2009, 14:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Promedio 2 campos

Matiasdagatti.

No te da en estos momentos, ya que el limite se lo aplicas a la salida, mas no a la consulta.
Esta vez creo que si te entendí. prueba con:

Código mysql:
Ver original
  1. SELECT (sum(t1.precio_com*t1.cantidad) / sum(t1.cantidad)) as promedio
  2. FROM (select precio_com,cantidad from det_com_venta
  3. where codpro = 1 order by codventa limit 10) t1;
De esta forma, establece el promedio de las ultimas 10 ventas.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 09/04/2009 a las 14:38
  #7 (permalink)  
Antiguo 09/04/2009, 14:35
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 17 años
Puntos: 0
Respuesta: Promedio 2 campos

Bueno lo hice asi

Código:
SELECT (sum(det_com_venta.precio_com*det_com_venta.cantidad) / sum(det_com_venta.cantidad)) as promedio FROM 
(SELECT precio_com,cantidad FROM det_com_venta WHERE codpro = 1 ORDER BY codventa LIMIT 10) det_com_venta
resultado = 6,6666667

osea no funciona

gracias por tu ayuda, seguiremos intentado
  #8 (permalink)  
Antiguo 10/04/2009, 03:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Promedio 2 campos

Entiendo que quieres buscar las medias de precio de los productos incluidos en las 10 últimas ventas (pero la media de todas las ventas de cada uno de esos productos); entiendo, así mismo, que tienes una fecha de venta o un codventa (como ha sugerido huesos52) que es la que uso para controlar las 10 últimas ventas, y entiendo, finalmente, que en la columna precio incluyes el total de la venta y no el precio de cada producto:

Código sql:
Ver original
  1. SELECT dcv.codpro, round((SUM(dcv.`precio_compra`)/SUM(dcv.cantidad)),2) AS promedio
  2. FROM det_com_venta dcv INNER JOIN (
  3.  
  4. SELECT DISTINCT codpro
  5. FROM det_com_venta
  6. ORDER BY codventa DESC
  7. LIMIT 10
  8. )t1 ON t1.codpro = dcv.codpro
  9. GROUP BY dcv.codpro

Y si quieres ver un producto (aunque no sabrás si está en las 10 últimas ventas hasta que hagas la consulta), por ejemplo, búsqueda de codpro=1.

Código sql:
Ver original
  1. SELECT dcv.codpro, round((SUM(dcv.`precio_compra`)/SUM(dcv.cantidad)),2) AS promedio
  2. FROM det_com_venta dcv INNER JOIN (
  3.  
  4. SELECT DISTINCT codpro
  5. FROM det_com_venta
  6. ORDER BY codventa DESC
  7. LIMIT 10
  8. )t1 ON t1.codpro = dcv.codpro WHERE dcv.codpro = 1
  9. GROUP BY dcv.codpro

Última edición por jurena; 10/04/2009 a las 05:03
  #9 (permalink)  
Antiguo 10/04/2009, 07:10
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 17 años
Puntos: 0
Respuesta: Promedio 2 campos

Bueno la verdad que no entiendo en ese codigo que me mandas que es dcv y t1, no se a que tabla se refiere. Acá como veras primero te mando mi tabla que es una sola y se llama det_com_venta

Lo que quiero hacer es sacar el promedio del precio de compra de un determinado producto (en mis ejemplos anteriores use el 1) de las ultima 10 ventas en las que se haya vendido ese determinado producto



mi tabla es una sola y es asi

det_com_venta

Código HTML:
codventa    codpro   cantidad   precio_com   sucursal
__________________________________________________________
12         1              2        125        A
18         1              1        125        A
19         1              1        65         A
20         1              1        125        A
21         1              1        75         A

Este es un ejemplo de los datos que tienen el codpro = 1, porque ovbiamente existen muchos mas datos con otros productos.
Entonces lo que estoy buscando es sacar el promedio de precio_com que en este ejemplo seria esto

640 / 6 = 106,6666667

porque la suma de los precio_com es 640 y se vendio 6 veces (hay 5 registros pero uno de ellos tiene como cantidad 2)

Solo uso esa sola tabla nada mas que eso

Bueno espero haberme explicado bien
Muchas gracias por su ayuda y perdón si no me explico bien
  #10 (permalink)  
Antiguo 10/04/2009, 07:33
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Promedio 2 campos

Hola matias.

O no te estas explicando bien, o estas implementando inadecuadamente las soluciones que tienes.

Código mysql:
Ver original
  1. mysql> create table det_com_venta(codventa integer, codpro integer, cantidad integer, precio_com integer, sucursal varchar(1));
  2. Query OK, 0 rows affected (0.06 sec)
  3.  
  4. mysql> insert into det_com_venta values(12,1,2,125,'A');
  5. Query OK, 1 row affected (0.00 sec)
  6.  
  7. mysql> insert into det_com_venta values(18,1,1,125,'A');
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> insert into det_com_venta values(19,1,1,65,'A');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> insert into det_com_venta values(20,1,1,125,'A');
  14. Query OK, 1 row affected (0.00 sec)
  15.  
  16. mysql> insert into det_com_venta values(21,1,1,75,'A');
  17. Query OK, 1 row affected (0.00 sec)
  18.  
  19. mysql> select *from det_com_venta;
  20. +-----------+---------+----------+--------+----------+
  21. | codventa | codpro | cantidad| precio_com|sucursal |
  22. +-----------+---------+----------+--------+----------+
  23. | 12        | 1       | 2        | 125    | A        |
  24. | 18        | 1       | 1        | 125    | A        |
  25. | 19        | 1       | 1        | 65     | A        |
  26. | 20        | 1       | 1        | 125    | A        |
  27. | 21        | 1       | 1        | 75     | A        |
  28. +-----------+---------+----------+--------+----------+
  29. 5 rows in set (0.00 sec)
  30.  
  31. mysql> SELECT (sum(t1.precio_com*t1.cantidad) / sum(t1.cantidad)) as promedio
  32.     -> FROM (SELECT precio_com,cantidad FROM det_com_venta
  33.     -> WHERE codpro = 1 ORDER BY codventa LIMIT 10) t1;
  34. +----------+
  35. | promedio |
  36. +----------+
  37. | 106.6667 |
  38. +----------+
  39. 1 row in set (0.00 sec)

Si no estoy mal, es la salida que quieres, con los datos que tienes, con el producto y venta que tienes.

Espero te sirva.

PD: Cuando jurena se refiere a dcv y t1 son los alias que pone a las tablas para un manejo mas limpio de los campos que requieres de cada una de las tablas. En este caso, el resultado de una consulta se simula como la existencia de una tabla. dcv es la tabla original y t1 es la tabla simulada con la consulta.
Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 10/04/2009 a las 07:47
  #11 (permalink)  
Antiguo 10/04/2009, 11:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Promedio 2 campos

huesos52 entendió mejor el valor de precio de compra precio_com, que, por lo que se ve es el precio de cada producto y no el acumulado en cada compra. Por lo tanto te valdrá su consulta y esta otra:
Código sql:
Ver original
  1. SELECT dcv.codpro, round( (
  2. SUM( dcv.precio_com * dcv.cantidad ) / SUM( dcv.cantidad ) ) , 2
  3. ) AS promedio
  4. FROM det_com_venta dcv
  5. INNER JOIN (
  6.  
  7. SELECT DISTINCT codpro
  8. FROM det_com_venta
  9. ORDER BY codventa DESC
  10. LIMIT 10
  11. )t1 ON t1.codpro = dcv.codpro
  12. GROUP BY dcv.codpro
y si quieres el 1
Código sql:
Ver original
  1. SELECT dcv.codpro, round( (
  2. SUM( dcv.precio_com * dcv.cantidad ) / SUM( dcv.cantidad ) ) , 2
  3. ) AS promedio
  4. FROM det_com_venta dcv
  5. INNER JOIN (
  6.  
  7. SELECT DISTINCT codpro
  8. FROM det_com_venta
  9. ORDER BY codventa DESC
  10. LIMIT 10
  11. )t1 ON t1.codpro = dcv.codpro WHERE dcv.codpro=1
  12. GROUP BY dcv.codpro
Las únicas diferencias con las de huesos52 son que la sintaxis que te propongo te permite sacar los valores de todos los productos de las últimas 10 compras, y que, además, te mostrará el codpro. Aunque si lo que quieres es la media (ya sabes qué codpro tienes), quizás la más rápida es la de huesos52.

Saludos a los dos, amigos.

Última edición por jurena; 14/04/2009 a las 00:52
  #12 (permalink)  
Antiguo 10/04/2009, 11:49
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 17 años
Puntos: 0
Respuesta: Promedio 2 campos

Ok esta bien entendí, tenes razón funciona bien así...
Les agradezco a los dos por su ayuda, me sirvió muchísimo, Muchas gracias
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:14.