Ver Mensaje Individual
  #3 (permalink)  
Antiguo 01/02/2018, 12:02
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 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.