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

[SOLUCIONADO] Ordenar registros (clientes) por el numero de pedidos

Estas en el tema de Ordenar registros (clientes) por el numero de pedidos en el foro de Mysql en Foros del Web. HOLA Buenas, ojala puedan echarme un cable -Tengo dos tablas clientes y pedidos -Las dos tablas están asociadas con el folioCliente -Un cliente puede tener ...
  #1 (permalink)  
Antiguo 31/01/2018, 14:15
 
Fecha de Ingreso: febrero-2016
Mensajes: 43
Antigüedad: 8 años, 2 meses
Puntos: 2
Ordenar registros (clientes) por el numero de pedidos

HOLA Buenas, ojala puedan echarme un cable

-Tengo dos tablas clientes y pedidos
-Las dos tablas están asociadas con el folioCliente
-Un cliente puede tener ninguno o muchos pedidos
-Un pedido es único y solo de un cliente

Lo que necesito es ordenar los clientes que tienen de mas a menor cantidad de pedidos (o también puede ser por la sumatoria del importe de los pedidos)

mis tablas están así

clientes
folioCliente
nombre
etc..

pedidos
id_pedido
nombre
importePedido
folioCliente
etc..

intente de dos formas

1
Código SQL:
Ver original
  1. SELECT SUM(precioPedido) AS precio, clientes.nombreCliente FROM clientes INNER JOIN pedidos ON clientes.folioCliente=pedidos.folioCliente  ORDER BY precio ASC;
  2. //lo unico que obtengo de esta forma es la sumatoria de todos los pedidos y el nombre del primer cliente


2
Código PHP:
Ver original
  1. $clientes = mysqli_query($conexion, "select folioCliente from clientes");
  2. while($c = mysqli_fetch_array($clientes)){
  3.  
  4. $num_pedidos = mysqli_query($conexion, "select count(nombreCliente) as num, clientes.folioCliente, clientes.nombreCliente from clientes inner join pedidos on clientes.folioCliente=pedidos.folioCliente where clientes.folioCliente = '".$c['folioCliente']."' ");    
  5.  
  6.     $n_p = mysqli_fetch_array($num_pedidos);
  7.         echo "
  8.             <tr>
  9.                 <td>".$n_p['num']."</td>
  10.                 <td>".$n_p['nombreCliente']."</td>
  11.                 <td>".$n_p['folioCliente']."</td>
  12.             </tr>
  13.         ";
  14. }
  15.  
  16. //obtengo un array con todos los folioCliente
  17. //recorro con un while todos los folioCliente con la consulta $num_pedidos, obtengo el numero de pedidos de cada cliente. Pero no logro ordenarlos de mayor a menor

No sé si le estoy dando muchas vueltas de las necesaria a este asunto, tal ves la solución es muy obvia pero no la veo,
Puedo solucionarlo con PHP o con una sql

Gracias por tu ayuda!!!
  #2 (permalink)  
Antiguo 31/01/2018, 15:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Ordenar registros (clientes) por el numero de pedidos

Podrias hacerlo asi:

Código MySQL:
Ver original
  1. SELECT SUM(precioPedido) AS precio, clientes.nombreCliente FROM clientes INNER JOIN pedidos ON clientes.folioCliente=pedidos.folioCliente  
  2. ) as tabla
  3. ORDER BY precio ASC;
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 01/02/2018, 12:02
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ordenar registros (clientes) por el numero de pedidos

Hola webtexcoco:

Mucho ojo, en tu primer consulta no estás agrupando por clientes, por lo tanto, la sumatoria que te da sería la de todos los pedidos y como dices, el nombre del primer cliente...

en la segunda consulta (la que está en el código de PHP) haces lo mismo, pero aquí estás filtrando por un cliente en específico. Esto te daría la sumatoria de sus pedidos, pero eso no significa que esa sea la mayor.

lo que tienes que hacer primero es AGRUPAR por clientes, para saber cuánto ha pedido cada uno de ellos y entonces ORDENAR por esta sumatoria. Veamos si con un ejemplo queda un poco más claro:

supongamos que tienes esta tabla:

Código MySQL:
Ver original
  1. mysql> select * from tu_tabla;
  2. +-----------+---------+---------+
  3. | id_pedido | cliente | importe |
  4. +-----------+---------+---------+
  5. |         1 | uno     |      10 |
  6. |         2 | uno     |      20 |
  7. |         3 | uno     |      30 |
  8. |         4 | uno     |      40 |
  9. |         5 | dos     |      10 |
  10. |         6 | dos     |      10 |
  11. |         7 | dos     |      10 |
  12. |         8 | tres    |     100 |
  13. |         9 | tres    |      50 |
  14. +-----------+---------+---------+
  15. 9 rows in set (0.00 sec)

Tal como estás poniendo tu consulta sin clausula GROUP BY, tendrías esto:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cliente,
  3.     ->   count(1) num_compras,
  4.     ->   sum(importe) total_compras
  5.     -> FROM tu_tabla;
  6. +---------+-------------+---------------+
  7. | cliente | num_compras | total_compras |
  8. +---------+-------------+---------------+
  9. | uno     |           9 |           280 |
  10. +---------+-------------+---------------+
  11. 1 row in set (0.01 sec)

es decir, con el count obtienes el total de compras y con el SUM el importe de las compras, pero como cliente te aparece UNO, como si todas las compras hubieran sido de él.

Entonces, ¿qué tienes que hacer? agrupar por cliente:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cliente,
  3.     ->   count(1) num_compras,
  4.     ->   sum(importe) total_compras
  5.     -> FROM tu_tabla
  6.     -> GROUP BY cliente
  7.     -> ORDER BY 2 desc;
  8. +---------+-------------+---------------+
  9. | cliente | num_compras | total_compras |
  10. +---------+-------------+---------------+
  11. | uno     |           4 |           100 |
  12. | dos     |           3 |            30 |
  13. | tres    |           2 |           150 |
  14. +---------+-------------+---------------+
  15. 3 rows in set (0.00 sec)
en este caso le estoy indicando que se ordene por la segunda columna que es el numero de compras por cliente de manera descendente, de tal suerte que en la primer posición se encuentra el cliente con el mayor número de compras.

También puedo ordenar por el tercer campo, así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cliente,
  3.     ->   count(1) num_compras,
  4.     ->   sum(importe) total_compras
  5.     -> FROM tu_tabla
  6.     -> GROUP BY cliente
  7.     -> ORDER BY 3 desc;
  8. +---------+-------------+---------------+
  9. | cliente | num_compras | total_compras |
  10. +---------+-------------+---------------+
  11. | tres    |           2 |           150 |
  12. | uno     |           4 |           100 |
  13. | dos     |           3 |            30 |
  14. +---------+-------------+---------------+
  15. 3 rows in set (0.00 sec)

en este caso, hasta arriba está el cliente TRES, porque a pesar de que sólo tiene 2 compras, fue el que más gastó.

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo.
  #4 (permalink)  
Antiguo 02/02/2018, 14:59
 
Fecha de Ingreso: febrero-2016
Mensajes: 43
Antigüedad: 8 años, 2 meses
Puntos: 2
Respuesta: Ordenar registros (clientes) por el numero de pedidos

Cita:
Iniciado por Libras Ver Mensaje
Podrias hacerlo asi:

Código MySQL:
Ver original
  1. SELECT SUM(precioPedido) AS precio, clientes.nombreCliente FROM clientes INNER JOIN pedidos ON clientes.folioCliente=pedidos.folioCliente  
  2. ) as tabla
  3. ORDER BY precio ASC;
gracias pero me siguio mostrando el mismo resultado

el primer cliente y la sumatoria de todos los pedidos
  #5 (permalink)  
Antiguo 02/02/2018, 15:11
 
Fecha de Ingreso: febrero-2016
Mensajes: 43
Antigüedad: 8 años, 2 meses
Puntos: 2
Respuesta: Ordenar registros (clientes) por el numero de pedidos

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola webtexcoco:

Mucho ojo, en tu primer consulta no estás agrupando por clientes, por lo tanto, la sumatoria que te da sería la de todos los pedidos y como dices, el nombre del primer cliente...

en la segunda consulta (la que está en el código de PHP) haces lo mismo, pero aquí estás filtrando por un cliente en específico. Esto te daría la sumatoria de sus pedidos, pero eso no significa que esa sea la mayor.

lo que tienes que hacer primero es AGRUPAR por clientes, para saber cuánto ha pedido cada uno de ellos y entonces ORDENAR por esta sumatoria. Veamos si con un ejemplo queda un poco más claro:

supongamos que tienes esta tabla:

Código MySQL:
Ver original
  1. mysql> select * from tu_tabla;
  2. +-----------+---------+---------+
  3. | id_pedido | cliente | importe |
  4. +-----------+---------+---------+
  5. |         1 | uno     |      10 |
  6. |         2 | uno     |      20 |
  7. |         3 | uno     |      30 |
  8. |         4 | uno     |      40 |
  9. |         5 | dos     |      10 |
  10. |         6 | dos     |      10 |
  11. |         7 | dos     |      10 |
  12. |         8 | tres    |     100 |
  13. |         9 | tres    |      50 |
  14. +-----------+---------+---------+
  15. 9 rows in set (0.00 sec)

Tal como estás poniendo tu consulta sin clausula GROUP BY, tendrías esto:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cliente,
  3.     ->   count(1) num_compras,
  4.     ->   sum(importe) total_compras
  5.     -> FROM tu_tabla;
  6. +---------+-------------+---------------+
  7. | cliente | num_compras | total_compras |
  8. +---------+-------------+---------------+
  9. | uno     |           9 |           280 |
  10. +---------+-------------+---------------+
  11. 1 row in set (0.01 sec)

es decir, con el count obtienes el total de compras y con el SUM el importe de las compras, pero como cliente te aparece UNO, como si todas las compras hubieran sido de él.

Entonces, ¿qué tienes que hacer? agrupar por cliente:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cliente,
  3.     ->   count(1) num_compras,
  4.     ->   sum(importe) total_compras
  5.     -> FROM tu_tabla
  6.     -> GROUP BY cliente
  7.     -> ORDER BY 2 desc;
  8. +---------+-------------+---------------+
  9. | cliente | num_compras | total_compras |
  10. +---------+-------------+---------------+
  11. | uno     |           4 |           100 |
  12. | dos     |           3 |            30 |
  13. | tres    |           2 |           150 |
  14. +---------+-------------+---------------+
  15. 3 rows in set (0.00 sec)
en este caso le estoy indicando que se ordene por la segunda columna que es el numero de compras por cliente de manera descendente, de tal suerte que en la primer posición se encuentra el cliente con el mayor número de compras.

También puedo ordenar por el tercer campo, así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cliente,
  3.     ->   count(1) num_compras,
  4.     ->   sum(importe) total_compras
  5.     -> FROM tu_tabla
  6.     -> GROUP BY cliente
  7.     -> ORDER BY 3 desc;
  8. +---------+-------------+---------------+
  9. | cliente | num_compras | total_compras |
  10. +---------+-------------+---------------+
  11. | tres    |           2 |           150 |
  12. | uno     |           4 |           100 |
  13. | dos     |           3 |            30 |
  14. +---------+-------------+---------------+
  15. 3 rows in set (0.00 sec)

en este caso, hasta arriba está el cliente TRES, porque a pesar de que sólo tiene 2 compras, fue el que más gastó.

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo.
woow muchas gracias Leo por tu gran explicación, no tenia mucha noción del group by pero con tu explicación me has resuelto muchas dudas.

Finalmente así quedo mi consulta.

Código SQL:
Ver original
  1. SELECT COUNT(1) AS num_pedidos, clientes.nombreCliente, SUM(precioPedido) AS total FROM clientes INNER JOIN pedidos ON clientes.folioCliente=pedidos.folioCliente GROUP BY nombreCliente ORDER BY 3 DESC;

Gracias por tu ayuda Leo

Etiquetas: numero, pedidos, registros, select, sql, tabla, todo
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:39.