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

Query para crear un reporte detallado

Estas en el tema de Query para crear un reporte detallado en el foro de Mysql en Foros del Web. Buenas foro. Tengo un problema al realizar una query para generar unos reportes, tengo un 90% de la consulta que necesito para generar el dichoso ...
  #1 (permalink)  
Antiguo 06/02/2013, 15:29
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Pregunta Query para crear un reporte detallado

Buenas foro.

Tengo un problema al realizar una query para generar unos reportes, tengo un 90% de la consulta que necesito para generar el dichoso reporte.

Ahora mi problema es que necesito que la query muestre el listado de los clientes el mes el rango de meses del que se esta haciendo el reporte, y hacer una suma total del total de cada mes.

Lo unico que me hacce falta es hacer la suma de cada mes, ya tengo lo demas o bueno al menos eso creo.

Esta es mi query:

Código MySQL:
Ver original
  1. SELECT c.cliente,
  2. CASE WHEN MONTH( fecha ) =1
  3. THEN "Enero"
  4. WHEN MONTH( f.fecha ) =2
  5. THEN "Febrero"
  6. WHEN MONTH( f.fecha ) =3
  7. THEN "Marzo"
  8. WHEN MONTH( f.fecha ) =4
  9. THEN "Abril"
  10. WHEN MONTH( f.fecha ) =5
  11. THEN "Mayo"
  12. WHEN MONTH( f.fecha ) =6
  13. THEN "Junio"
  14. WHEN MONTH( f.fecha ) =7
  15. THEN "Julio"
  16. WHEN MONTH( f.fecha ) =8
  17. THEN "Agosto"
  18. WHEN MONTH( f.fecha ) =9
  19. THEN "Septiembre"
  20. WHEN MONTH( f.fecha ) =10
  21. THEN "Octubre"
  22. WHEN MONTH( f.fecha ) =11
  23. THEN "Noviembre"
  24. WHEN MONTH( f.fecha ) =12
  25. THEN "Diciembre"
  26. ELSE "esto no es un mes"
  27. END AS mes, YEAR( f.fecha ) AS año, SUM( f.totalFactura ) AS total
  28. FROM factura AS f
  29. JOIN cliente AS c ON f.clienteID = c.clienteID
  30. WHERE fecha
  31. BETWEEN '2013/01/01'
  32. AND '2013/02/06'
  33. GROUP BY cliente, mes

Agradeceria sus comentarios
__________________
Lo imposible solo cuesta un poco mas
  #2 (permalink)  
Antiguo 06/02/2013, 15:53
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Query para crear un reporte detallado

Hola jandrogdz:

por qué no comienzas por decirnos cuál es la estructura de tus tablas y nos pones algunos datos de ejemplo... a partir de estos datos de ejemplo puedes también decirnos qué es lo que esperas obtener como salida, creo que de esta manera quedará más claro cual es tu problema...

en cuanto a tu consulta, tengo algunas observaciones que hacer, por ejemplo al ordenar por el campo "mes" en realidad estarías ordenando alfabéticamente, es decir abril y agostro estarían antes que enero y febrero, es correcto esto?

Segundo, la forma en que estás usando el CASE-WHEN no es del todo óptima, ya que en cada caso estás haciendo 12 conversiones... te recuerdo que el CASE-WHEN tiene dos formas de hacer las comparaciones,

http://dev.mysql.com/doc/refman/5.0/...statement.html

Te recomiendo que lo hagas así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM meses;
  2. +---------+
  3. | num_mes |
  4. +---------+
  5. |       1 |
  6. |       2 |
  7. |       8 |
  8. |      12 |
  9. +---------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT num_mes,
  13.     ->   CASE num_mes WHEN 1 THEN 'Enero'
  14.     ->        WHEN 2 THEN 'Febrero'
  15.     ->        WHEN 3 THEN 'Marzo'
  16.     ->        WHEN 4 THEN 'Abril'
  17.     ->        WHEN 8 THEN 'Agosto'
  18.     ->        WHEN 12 THEN 'Diciembre'
  19.     ->   END mes
  20.     -> FROM meses;
  21. +---------+-----------+
  22. | num_mes | mes       |
  23. +---------+-----------+
  24. |       1 | Enero     |
  25. |       2 | Febrero   |
  26. |       8 | Agosto    |
  27. |      12 | Diciembre |
  28. +---------+-----------+
  29. 4 rows in set (0.00 sec)

Observa que no hay necesidad de poner en cada caso la comparacion

Código:
MONTH( f.fecha ) = 2
Saludos
Leo.
  #3 (permalink)  
Antiguo 06/02/2013, 16:28
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Query para crear un reporte detallado

Ok gracias por contestar.

Ya he conseguido hacer la sumatoria de todo y sacar el total de cada mes solo me falta sumar todos los totales de cada mes ejemplo

NOMBRE DEL CLIENTE ENE FEB MAR... TOTAL
cliente1 20 10 10 40
cliente2 10 0 10 20
...

30 10 20 60

Espero me de a entender.

aaa por cierto mi consulta hasta ahorita esta asi:

Código MySQL:
Ver original
  1. SELECT c.cliente, YEAR( f.fecha ) Año,
  2. SUM(CASE WHEN MONTH( f.fecha ) = 1 THEN totalFactura ELSE 0 END) AS Enero,
  3. SUM(CASE WHEN MONTH( f.fecha ) = 2 THEN totalFactura ELSE 0 END) Febrero,
  4. SUM(CASE WHEN MONTH( f.fecha ) = 3 THEN totalFactura ELSE 0 END) Marzo,
  5. SUM(CASE WHEN MONTH( f.fecha ) = 4 THEN totalFactura ELSE 0 END) Abril,
  6. SUM(CASE WHEN MONTH( f.fecha ) = 5 THEN totalFactura ELSE 0 END) Marzo,
  7. SUM(CASE WHEN MONTH( f.fecha ) = 6 THEN totalFactura ELSE 0 END) Junio,
  8. SUM(CASE WHEN MONTH( f.fecha ) = 7 THEN totalFactura ELSE 0 END) Julio,
  9. SUM(CASE WHEN MONTH( f.fecha ) = 8 THEN totalFactura ELSE 0 END) Agosto,
  10. SUM(CASE WHEN MONTH( f.fecha ) = 9 THEN totalFactura ELSE 0 END) Septiembre,
  11. SUM(CASE WHEN MONTH( f.fecha ) = 10 THEN totalFactura ELSE 0 END) Octubre,
  12. SUM(CASE WHEN MONTH( f.fecha ) = 11 THEN totalFactura ELSE 0 END) Noviembre,
  13. SUM(CASE WHEN MONTH( f.fecha ) = 12 THEN totalFactura ELSE 0 END) Diciembre,
  14. SUM( f.totalFactura ) AS totalgral
  15. FROM factura AS f JOIN  cliente AS c ON f.clienteID = c.clienteID
  16. WHERE fecha BETWEEN '2013/01/01' AND '2013/02/06'
  17. GROUP BY cliente
__________________
Lo imposible solo cuesta un poco mas
  #4 (permalink)  
Antiguo 06/02/2013, 18:37
 
Fecha de Ingreso: noviembre-2012
Ubicación: Villa Maria, Peru
Mensajes: 46
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Query para crear un reporte detallado

facil men usa un acumulador
Código PHP:
$sumatotaldemeses+=$sumademes 
esto tiene que ir dentro de un bucle,
para que por cada mes, se vaya acumulando el monto de ese mes, con el monto anterior, y al finalizar todo el bucle ese variable tendra la suma de todos los meses
Esa consulta que estas haciendo te va traer problemas men, es muy pesada, con datos grandes va volar estas usando 12 clausulas SUM
  #5 (permalink)  
Antiguo 07/02/2013, 09:11
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Query para crear un reporte detallado

Hola jandrogdz:

Lo único que tienes que hacer es agregar el modificador WIHT ROLLUP a la cláusula GROUP BY:

http://dev.mysql.com/doc/refman/5.0/...modifiers.html

Checa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +-----------+------------+-------+
  3. | cliente   | fecha      | total |
  4. +-----------+------------+-------+
  5. | cliente 1 | 2013-02-01 |    10 |
  6. | cliente 2 | 2013-01-02 |    18 |
  7. | cliente 1 | 2013-02-03 |    21 |
  8. | cliente 1 | 2013-02-04 |    32 |
  9. | cliente 2 | 2013-01-05 |    11 |
  10. | cliente 1 | 2013-01-06 |    50 |
  11. | cliente 2 | 2013-02-07 |    62 |
  12. | cliente 2 | 2013-02-08 |    10 |
  13. | cliente 2 | 2013-01-09 |    12 |
  14. | cliente 1 | 2013-01-10 |    22 |
  15. | cliente 1 | 2013-01-11 |    13 |
  16. +-----------+------------+-------+
  17. 11 rows in set (0.00 sec)
  18.  
  19. mysql> SELECT cliente, YEAR( fecha ) Anio,
  20.     -> SUM(CASE WHEN MONTH( fecha ) = 1 THEN total ELSE 0 END) AS Enero,
  21.     -> SUM(CASE WHEN MONTH( fecha ) = 2 THEN total ELSE 0 END) Febrero,
  22.     -> SUM(CASE WHEN MONTH( fecha ) = 3 THEN total ELSE 0 END) Marzo,
  23.     -> SUM( total ) AS totalgral
  24.     -> FROM tabla
  25.     -> WHERE fecha BETWEEN '2013-01-01' AND '2013-02-28'
  26.     -> GROUP BY cliente WITH ROLLUP;
  27. +-----------+------+-------+---------+-------+-----------+
  28. | cliente   | Anio | Enero | Febrero | Marzo | totalgral |
  29. +-----------+------+-------+---------+-------+-----------+
  30. | cliente 1 | 2013 |    85 |      63 |     0 |       148 |
  31. | cliente 2 | 2013 |    41 |      72 |     0 |       113 |
  32. | NULL      | 2013 |   126 |     135 |     0 |       261 |
  33. +-----------+------+-------+---------+-------+-----------+
  34. 3 rows in set (0.00 sec)


En cuanto al comentario de dark_17

Cita:
Esa consulta que estas haciendo te va traer problemas men, es muy pesada, con datos grandes va volar estas usando 12 clausulas SUM
No estoy de acuerdo, Siempre será preferible hacer las consultas del lado del servidor de BD y no utilizando algún lenguaje de programación, pues a final de cuentas el bucle tendría que recorrer el total de registros de la tabla, mientras que el motor de BD tiene procesos optimizados para hacer las consultas más eficientes. Si tienes un buen manejo de índices, podría apostar mi desayuno del día de hoy a que sería más rápido la consulta que lo que propone dark_17.

Sería interesante que hicieras la prueba y nos dijeras los resultados... pero mucho ojo, temas de programación no se deben tratar en este foro... políticas de uso.

Saludos
Leo.
  #6 (permalink)  
Antiguo 07/02/2013, 09:30
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Query para crear un reporte detallado

Muchas gracias por tu ayuda me ha servido de mucho otra pregunta lonardo_josue para hacer algo similar a eso pero por meses y años.

Es decir:


2011 2012 2013 total
Enero 10 10 20 40
Febrero 10 20 5 35

Como podria hacerle y gracias por tus comentarios.
__________________
Lo imposible solo cuesta un poco mas
  #7 (permalink)  
Antiguo 07/02/2013, 10:24
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Query para crear un reporte detallado

Hola jandrogdz:

Veo que abriste otra post con la misma pregunta, así es que te contesto en el otro post para dar este como concluido.

Saludos.
Leo.

Etiquetas: join, query, reporte, select
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 21:55.