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

Subtotales dentro de una Consulta

Estas en el tema de Subtotales dentro de una Consulta en el foro de Mysql en Foros del Web. Saludos amigos del foro Requiero preparar una especie de reportes, estoy utilizando Mysql en php y estoy tratando de obtener subtotales dentro de una consulta, ...
  #1 (permalink)  
Antiguo 18/07/2012, 10:41
 
Fecha de Ingreso: abril-2008
Mensajes: 112
Antigüedad: 16 años, 6 meses
Puntos: 0
Subtotales dentro de una Consulta

Saludos amigos del foro

Requiero preparar una especie de reportes, estoy utilizando Mysql en php y
estoy tratando de obtener subtotales dentro de una consulta, de manera que pueda tener algo como muestra esta imagen:


http://www.flickr.com/photos/7811442...in/photostream

mi consulta es la siguiente:
Código MySQL:
Ver original
  1. SELECT orden.id_orden, ordendetalle.codigo_producto, productos.descripcion,
  2. ordendetalle.precio_compra, ordendetalle.cantidad_recibida,
  3. ordendetalle.precio_compra *ordendetalle.cantidad_recibida as Total
  4. FROM productos, orden, ordendetalle, proveedores
  5. WHERE productos.codigo_producto = ordendetalle.codigo_producto
  6. AND ordendetalle.id_orden = orden.id_orden
  7. AND orden.id_proveedor = proveedores.id_proveedor
  8. AND proveedores.nombre_proveedor = '$proveedor'"

Estaba buscando info y al parecer ROLLUP sería algo que podría ayudarme, pero la verdad no lo tengo muy claro, soy un tanto novato en estos asuntos.

Alguien tiene alguna sugerencia o idea de como podria hacerlo, muchas gracias.

Última edición por gnzsoloyo; 22/07/2014 a las 14:26
  #2 (permalink)  
Antiguo 18/07/2012, 11:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Subtotales dentro de una Consulta

Hola Angel_Nemo:

No pude visualizar la imagen que subiste, (he tenido algunos problemas con mi conexión de internet), pero por la descripción del problema creo que efectivamente el modificador ROLLUP de podría ayudar. Dale un vistazo a la documentación oficial:

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

En los ejemplos que aparecen, observa que los registros que tienen NULL en alguna columna son justamente los subtotales:

Código:
mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | India   | NULL       |        1350 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2000 | USA     | NULL       |        1575 |
| 2000 | NULL    | NULL       |        4525 |
| 2001 | Finland | Phone      |          10 |
| 2001 | Finland | NULL       |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
| 2001 | USA     | NULL       |        3000 |
| 2001 | NULL    | NULL       |        3010 |
| NULL | NULL    | NULL       |        7535 |
+------+---------+------------+-------------+
Los elementos marcados con ROJO representan el subtotal por año y pais. Los elementos marcados con Verde representan el subtotal por año, y finalmente el marcado como Azul representa el total-total

Saludos
Leo.
  #3 (permalink)  
Antiguo 18/07/2012, 13:49
 
Fecha de Ingreso: abril-2008
Mensajes: 112
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Subtotales dentro de una Consulta

Gracias por tu respuesta leonardo_josue

Si....
en efecto, algo así es lo que debo hacer, aunque me vendría perfecto manipular la etiqueta NULL dada por MySQL (no se si se pueda), para poder darle una etiqueta propia como "subtotal" o "Total General", puesto que para presentar un reporte de valores, no queda muy claro en la manera en que se encuentra, en la documentación que me indicas.

Aunque también estaba checkeando la función COMPUTE BY, pero es de SQL server, esa función permite hacer lo que necesito, pero al parecer no existe una función equivalente en MySQL.
  #4 (permalink)  
Antiguo 18/07/2012, 14:24
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Subtotales dentro de una Consulta

Hola de nuevo...

Puedes manipular sin ningún problemas las etiquetas NULL para colocar el texto que tengas, lo puedes hacer de varias maneras, la más sencilla sería con IFNULL, aunque podrías también hacerlo con IF o con un CASE-WHEN. continuando con el ejemplo que aparece en la documentación tú podrías hacer algo como esto:

Código:
SELECT 
IFNULL(year, 'Total General') year,
IF(country IS NULL, 'Subtotal por Año', country) country,
CASE WHEN product IS NULL THEN 'Subtotal por pais' ELSE product END product
.....
.....
Esto te regresaría algo así:

Código:
+---------------+---------+------------+-------------+
| year          | country | product    | SUM(profit) |
+---------------+---------+------------+-------------+
| 2000          | Finland          | Computer                |        1500 |
| 2000          | Finland          | Phone                   |         100 |
| 2000          | Finland          | Subtotal por pais       |        1600 |
....
| 2000          | Subtotal por año | subtotal por país |        4525 |
........
| Total General | Subtotal por año | subtotal por país |        7535 |
+---------------+---------+------------+-------------+
Obviamente podrías preferir por que en el último de los casos sólo apareciera la leyenda en la primer columna, por lo que la segunda y tercer condición deberían ser modificadas.

Saludos
Leo.
  #5 (permalink)  
Antiguo 20/07/2012, 10:01
 
Fecha de Ingreso: abril-2008
Mensajes: 112
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Subtotales dentro de una Consulta

Saludos

No habia tenido tiempo de revisar y responder estos últimos días.
Tu sugerencia me ha servido mucho, teniendo una consulta así:

Código MySQL:
Ver original
  1. SELECT orden.id_orden, IFNULL(productos.descripcion, 'TOTAL:------------------------------') AS Producto, SUM(ordendetalle.precio_compra * ordendetalle.cantidad_recibida) as Total
  2. FROM productos, orden, ordendetalle, proveedores
  3. WHERE productos.codigo_producto = ordendetalle.codigo_producto
  4. AND ordendetalle.id_orden = orden.id_orden
  5. AND orden.id_proveedor = proveedores.id_proveedor
  6. AND proveedores.nombre_proveedor = '$proveedor'
  7. GROUP BY ordendetalle.id_orden, productos.descripcion WITH ROLLUP

La pongo por si a alguien mas le sirve y me da como resultado:


http://www.flickr.com/photos/7811442...in/photostream

Quedo muy agradecido.

Última edición por gnzsoloyo; 22/07/2014 a las 14:27
  #6 (permalink)  
Antiguo 20/07/2012, 14:00
 
Fecha de Ingreso: abril-2008
Mensajes: 112
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Subtotales dentro de una Consulta

Me funciona muy bien gracias, pero al tratar de detallar mas este "reporte", surge un pequeño problema:

[IMG]http://www.flickr.com/photos/7811442...in/photostream[/IMG]

Se repiten los valores del último registro correspondiente a un identificador, estos no se suman ni nada, pero estéticamente pueden representar un problema, por que pueden ser mal interpretados por alguien que no se fije bien.

No consigo eliminarlos

Etiquetas: php, select, sql, subtotales
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 16:30.