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

Máximo de sumas

Estas en el tema de Máximo de sumas en el foro de Mysql en Foros del Web. Hola, buenos días! Me estoy volviendo algo loco con una consulta, que debe resultar sencilla. Tengo una tabla con los siguientes campos: CLIENTE, TIPO, IDREG, ...
  #1 (permalink)  
Antiguo 26/08/2013, 05:55
 
Fecha de Ingreso: junio-2008
Ubicación: Madrid
Mensajes: 73
Antigüedad: 15 años, 10 meses
Puntos: 1
Pregunta Máximo de sumas

Hola, buenos días!
Me estoy volviendo algo loco con una consulta, que debe resultar sencilla.
Tengo una tabla con los siguientes campos: CLIENTE, TIPO, IDREG, FECHA, y VALOR.

Cada registro de la tabla es un VALOR, para una FECHA concreta, para cada IDREG de un mismo CLIENTE. Es decir, por ejemplo:

001A "Tipo1" 100AB 10-2009 100.00
001A "Tipo1" 100AB 10-2009 100.00
001B "Tipo2" 100AC 10-2009 100.00
001B "Tipo1" 100AD 10-2009 100.00
001B "Tipo2" 100AC 10-2009 100.00
001B "Tipo1" 100AF 10-2009 200.00
001B "Tipo2" 100AE 10-2009 100.00

Quiero obtener los valores máximos para las sumas de cada CLIENTE, filtrando por FECHA y TIPO.

Es decir, si filtro por 10-2009 y "Tipo1", los resultados de la suma (agrupando por IDREG) es:
001A 100AB 200.00
001B 100AD 100.00
001B 100AF 200.00

De los cuales, el resultado de los máximos debería quedar en:
001A 100AB 200.00
001B 100AF 200.00

Es este último paso el que no consigo realizar.
He probado con:
Código MySQL:
Ver original
  1.     clienteid AS "CLIENTE",
  2.     MAX(suma)
  3.     (SELECT clienteid, SUM(saldo) AS "suma" FROM etl.creditos
  4.     WHERE (mes_datos BETWEEN '2009-08-01' AND '2009-10-01') AND (titularidad_tipo LIKE 'TITULAR')
  5.     GROUP BY clienteid, nuc) as sum
  6.     clienteid
  7.     clienteid;

Pero los resultados difieren de las sumas.

ACT 001: He comprobado que IDREG se repite para varios CLIENTE

Última edición por Wolfchamane; 26/08/2013 a las 06:01
  #2 (permalink)  
Antiguo 26/08/2013, 10:47
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Máximo de sumas

Hola Wolfchamane:

A ver, por un lado hablas de unas estructura de datos y en tu consulta manejas nombres de columnas y tablas distintos... ojo con eso, si vas a poner datos de ejemplo, pues basa tus consultas en esos datos... por ejemplo, tus campos mes_datos, saldo, titularidad_tipo o nuc, NO EXISTEN EN TUS DATOS DE EJEMPLO, o tu campo fecha NO ES DE TIPO DATE, por lo tanto no podemos decirte donde está el problema...

para el script, me voy a basas estrictamente en tus datos que pones de ejemplo, es decir:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +---------+-------+-------+---------+-------+
  3. | CLIENTE | TIPO  | IDREG | FECHA   | VALOR |
  4. +---------+-------+-------+---------+-------+
  5. | 001A    | Tipo1 | 100AB | 10-2009 |   100 |
  6. | 001A    | Tipo1 | 100AB | 10-2009 |   100 |
  7. | 001B    | Tipo2 | 100AC | 10-2009 |   100 |
  8. | 001B    | Tipo1 | 100AD | 10-2009 |   100 |
  9. | 001B    | Tipo2 | 100AC | 10-2009 |   100 |
  10. | 001B    | Tipo1 | 100AF | 10-2009 |   200 |
  11. | 001B    | Tipo2 | 100AE | 10-2009 |   100 |
  12. +---------+-------+-------+---------+-------+
  13. 7 rows in set (0.01 sec)

Ahora bien, para obtener el primer resultado que colocas, es decir, la sumatoria agrupando por cliente para el Tipo = Tipo1 y la fecha = 10-2009, haces lo siguiente:

CONSULTA 1
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cliente, idreg, SUM(valor) suma
  3.     -> FROM tabla
  4.     -> WHERE tipo = 'Tipo1' AND fecha = '10-2009'
  5.     -> GROUP BY idreg;
  6. +---------+-------+------+
  7. | cliente | idreg | suma |
  8. +---------+-------+------+
  9. | 001A    | 100AB |  200 |
  10. | 001B    | 100AD |  100 |
  11. | 001B    | 100AF |  200 |
  12. +---------+-------+------+
  13. 3 rows in set (0.00 sec)

Ahora bien, lo si entendí correctamente, lo que quieres obtener es el MAX(suma) para cada cliente, con su respectivo idreg correcto??? esto lo puedes obtener de muchas formas, la más "simple" es con JOIN's por un lado, obtienes el valor máximo para cada cliente:

CONSULTA 2
Código MySQL:
Ver original
  1. mysql> SELECT cliente, MAX(suma) max_suma FROM
  2.     ->     ( SELECT
  3.     ->         cliente, idreg, SUM(valor) suma
  4.     ->       FROM tabla
  5.     ->       WHERE tipo = 'Tipo1' AND fecha = '10-2009'
  6.     ->       GROUP BY idreg
  7.     ->     ) T2 GROUP BY T2.cliente;
  8. +---------+----------+
  9. | cliente | max_suma |
  10. +---------+----------+
  11. | 001A    |      200 |
  12. | 001B    |      200 |
  13. +---------+----------+
  14. 2 rows in set (0.01 sec)

Si observas, a esta última consulta, lo único que le falta es el idReg... puedes utilizar esta última consulta para filtrar la información de la consulta anterior, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM
  2.     ->   ( SELECT
  3.     ->       cliente, idreg, SUM(valor) suma
  4.     ->     FROM tabla
  5.     ->     WHERE tipo = 'Tipo1' AND fecha = '10-2009'
  6.     ->     GROUP BY idreg) T1
  7.     ->   INNER JOIN
  8.     ->   ( SELECT cliente, MAX(suma) max_suma FROM
  9.     ->     ( SELECT
  10.     ->         cliente, idreg, SUM(valor) suma
  11.     ->       FROM tabla
  12.     ->       WHERE tipo = 'Tipo1' AND fecha = '10-2009'
  13.     ->       GROUP BY idreg
  14.     ->     ) T2 GROUP BY T2.cliente
  15.     ->   ) T3 ON T1.cliente = T3.cliente AND T1.suma = T3.max_suma;
  16. +---------+-------+------+
  17. | cliente | idreg | suma |
  18. +---------+-------+------+
  19. | 001A    | 100AB |  200 |
  20. | 001B    | 100AF |  200 |
  21. +---------+-------+------+
  22. 2 rows in set (0.01 sec)

Si observas, T1 en realidad es la consulta 1, y T3 es en realidad toda la consulta 2... hay otras maneras de obtener este resultado, es cuestión de que investigues un poco más.

Haz la prueba con tus tablas reales y tus datos, si tienes problemas postea las estructuras y nombres reales y algunos datos de ejemplo, no importa que sean ficticios

Saludos
Leo.

Etiquetas: max, sum
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 06:34.