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

.:Consulta por Agrupación:.

Estas en el tema de .:Consulta por Agrupación:. en el foro de Mysql en Foros del Web. Hola a tod@s, Estoy teniendo problemas para agrupar y sumar los resultados de una consulta. La consulta es la siguiente: SELECT top2.products_quantity FROM toc_orders_products top2, ...
  #1 (permalink)  
Antiguo 19/09/2011, 04:07
 
Fecha de Ingreso: julio-2010
Mensajes: 23
Antigüedad: 13 años, 8 meses
Puntos: 0
.:Consulta por Agrupación:.

Hola a tod@s,

Estoy teniendo problemas para agrupar y sumar los resultados de una consulta. La consulta es la siguiente:

SELECT top2.products_quantity
FROM toc_orders_products top2, toc_orders_status_history tosh2
WHERE 20 = top2.products_id
AND top2.orders_id = tosh2.orders_id
AND (tosh2.orders_status_id = 4 OR tosh2.orders_status_id = 5 OR tosh2.orders_status_id = 6 OR tosh2.orders_status_id = 7)
GROUP BY tosh2.orders_id


Hasta aquí todo bien, obtengo, del libro con ID = 20, dos registros (ya que sólo hay dos órdenes de pedidos) con la cantidad de libros comprados por cada registros (en un mismo pedido pueden repetirse los libros), que son 4 y 1 respectivamente.

Ahora lo que quiero es agrupar por libro, para que me sume la cantidad de libros comprados de todas las ordenes, que el código quedaría

SELECT SUM(top2.products_quantity)
FROM toc_orders_products top2, toc_orders_status_history tosh2
WHERE 20 = top2.products_id
AND top2.orders_id = tosh2.orders_id
AND (tosh2.orders_status_id = 4 OR tosh2.orders_status_id = 5 OR tosh2.orders_status_id = 6 OR tosh2.orders_status_id = 7)
GROUP BY top2.products_id,tosh2.orders_id


Ahora me aparece un sólo registro, el cuál contiene 14 . Creo que se debe a que, en la tabla toc_orders_status_history, un mismo orden aparece varias veces, ya que este pasa por varios estados (detalle que tengo en cuenta en la consulta). Entonces, tengo que agrupar por orders_id, o sea, por orden. Pero parece que ahí es donde creo está el problema, creo que no me está agrupando por orders_id.

Si alguien da con la solución, le estaría enormemente agradecido.

Gracias y saludos!
  #2 (permalink)  
Antiguo 19/09/2011, 06:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: .:Consulta por Agrupación:.

Código MySQL:
Ver original
  1. SELECT top2.products_id,tosh2.orders_id,SUM(top2.products_quantity)
  2. FROM toc_orders_products top2 LEFT JOIN toc_orders_status_history tosh2
  3. ON top2.orders_id = tosh2.orders_id
  4. WHERE top2.products_id=20
  5. AND (tosh2.orders_status_id = 4
  6.               OR tosh2.orders_status_id = 5
  7.                       OR tosh2.orders_status_id = 6
  8.                               OR tosh2.orders_status_id = 7)
  9. GROUP BY top2.products_id,tosh2.orders_id

Mira si así ves mas claro lo que te esta haciendo

SELECT top2.products_id,tosh2.orders_id,SUM(top2.products _quantity)
....
GROUP BY top2.products_id,tosh2.orders_id

Esto suma products_quantity para cada combinacion de products_id,orders_id en tu caso como limitas por top2.products_id=20 te dará la suma para cada orders_id distintos relacionados con top2.products_id=20.... si solo sale un numero serà que products_id=20 solo tinen un orders_id donde ademas orders_status_id es 4,5,6 o 7.

AND (tosh2.orders_status_id = 4
OR tosh2.orders_status_id = 5
OR tosh2.orders_status_id = 6
OR tosh2.orders_status_id = 7)

es igal a AND tosh2.orders_status IN (4,5,6,7) mas comodo no?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 19/09/2011 a las 06:18
  #3 (permalink)  
Antiguo 20/09/2011, 02:14
 
Fecha de Ingreso: julio-2010
Mensajes: 23
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: .:Consulta por Agrupación:.

Gracias por tu ayuda quimfv, pero creo que no me has entendido bien mi problema o no me explicado bien.

Con el siguiente código, bastante sencillo de entender (gracias quimfv por mostrar la sentencia IN):

Código:
SELECT top2.products_id, tosh2.orders_id, top2.products_quantity
FROM toc_orders_products top2, toc_orders_status_history tosh2
WHERE top2.orders_id = tosh2.orders_id
AND top2.products_id = 20
AND tosh2.orders_status_id IN (5,6,7)
Obtengo esto:

///////////////////////////// /////////////////////// ////////////////////////////

products_id | orders_id | products_quantity
---------------------------- ------------------------ -----------------------------
20 | 5 | 1
---------------------------- |---------------------------|------------------------------
20 | 5 | 1
---------------------------- |---------------------------|------------------------------
20 | 4 | 4
---------------------------- |---------------------------|------------------------------
20 | 4 | 4
---------------------------- |---------------------------|------------------------------
20 | 4 | 4
---------------------------- |---------------------------|------------------------------

Bien, yo lo quiero hacer es, primero, que no me repita los orders_id, quedando la tabla así:


///////////////////////////// /////////////////////// ////////////////////////////

products_id | orders_id | products_quantity
---------------------------- ------------------------ -----------------------------
20 | 5 | 1
---------------------------- |---------------------------|------------------------------
20 | 4 | 4
---------------------------- |---------------------------|------------------------------

Y por último, que me sume los products_quantity de todos los orders_id, y que me quede así (debería dejar de mostrar orders_id)

///////////////////////////// ////////////////////////

products_id | products_quantity
---------------------------- ------------------------
20 | 5 |
---------------------------- |---------------------------|

Creo que esta vez ha quedado más claro

A ver si alguien da con la clave, pues me voy a volver loco xD

Gracias por la ayuda, saludos!

Edito: Mi intentento de dibujar las tablas no salen como me esperaba, pero creo que se entiende lo que quiero, sorry :P

Última edición por JCorfer; 20/09/2011 a las 05:03
  #4 (permalink)  
Antiguo 22/09/2011, 01:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: .:Consulta por Agrupación:.

A!!!!! que tienes repeticiones que no te interesan, ahora lo entiendo. (Un diseño raro...)

Código MySQL:
Ver original
  1. SELECT sbc.products_id,
  2.              SUM(sbc.products_quantity) as Total
  3. FROM (SELECT DISTINCT top2.products_id,
  4.                              tosh2.orders_id,
  5.                              top2.products_quantity
  6.              FROM toc_orders_products top2
  7.                    INNER JOIN toc_orders_status_history tosh2
  8.                             ON top2.orders_id = tosh2.orders_id
  9.              WHERE tosh2.orders_status_id IN (5,6,7)
  10.                   AND top2.products_id = 20) as sbc
  11. GROUP BY sbc.products_id;

La subconsulta da lo primero que pides

products_id | orders_id | products_quantity
---------------------------- ------------------------ -----------------------------
20 | 5 | 1
---------------------------- |---------------------------|------------------------------
20 | 4 | 4
---------------------------- |---------------------------|------------------------------

y luego se suma...

products_id | total
---------------------------- ------------------------
20 | 5 |
---------------------------- |---------------------------|
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 22/09/2011, 01:23
 
Fecha de Ingreso: julio-2010
Mensajes: 23
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: .:Consulta por Agrupación:.

Bua quimfv, te has salido!, mis conocimientos de base de datos no llegaban a tanto, pero ya he aprendido algo nuevo.

Problema solucionado, muchas gracias quimfv!!

Saludos!

Etiquetas: registros, 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 11:23.