TransWikia.com

¿Cómo mostrar los totales por cada grupo de datos?

Stack Overflow en español Asked by Jonathan Alarcon on January 19, 2021

Necesito saber si es posible mostrar el total de una suma por cada grupo de datos

Tengo la siguiente tabla defectos

introducir la descripción de la imagen aquí

Estoy realizando la siguiente consulta

SET lc_time_names = 'es_ES';
SELECT maquina,UPPER(MONTHNAME(fecha)) as mes,SUM(manchas) as manchas
FROM defectos
GROUP BY maquina,MONTH(fecha)

Devolviendo los siguientes datos

introducir la descripción de la imagen aquí

Es posible mostrar los totales por cada maquina, es decir de la siguiente forma (ejemplo realizado en excel para efectos prácticos)

introducir la descripción de la imagen aquí

One Answer

Comenzaré diciendo que esto generalmente se resuelve en la capa de presentación de datos y no en una consulta a la base de datos.

En otras palabras, cuando tienes un sistema en el que usuarios (que no son programadores) interactúan ingresando y recuperando información, lo hacen en una Interfaz de Usuario, también conocida como capa de presentación, que está desarrollada uno o varios lenguajes de programación (que no son SQL) y sobre cierta arquitectura. Es allí donde suele calcularse e incluirse los totales que te interesa. No profundizaré más, dado que una simple respuesta aquí no da para tanto, pero hay literatura al respecto.

Eso no significa que no pueda hacerse a nivel de base de datos, pero en realidad la base de datos no es para eso. Te muestro como podrías realizarlo, más con fines educativos sobre SQL, manteniendo mi recomendación de que NO HAGAS ESTO en un sistema que va a estar en producción.

Pensemos primero en dos consultas, una, como la que ya tienes que nos da la sumatoria por máquina y mes, por ejemplo:

select   Maquina
       , MonthName(fecha) as mes
       , sum(manchas) as Manchas   
  from defectos  
 group by Maquina, MonthName(fecha) 

Si queremos saber el total de manchas por máquina, podemos quitar el mes, y tendríamos:

select   Maquina
       , sum(manchas) as TotalManchas   
  from defectos  
 group by Maquina

Lo que quieres construir es, en realidad, una intercalación de estas dos consultas. Con un poco de ingenio, podemos construir una unión de las dos consultas, para lo cual necesitamos

  • Que ambas consultas devuelvan las mismas columnas
  • Tener una forma de ordenar el resultado final que nos permita tener cada máquina con sus meses y al final el total, luego otra máquina con sus meses y el total.

La segunda parte, se me ocurre incluir el número del mes en la primera consulta, y un número superior en la segunda, de manera que podamos ordenar por máquina y número de mes.

Entonces, la base del resultado final podría obtenerse con:

select   Maquina
       , Month(fecha) as NumeroMes
       , MonthName(fecha) as Mes
       , sum(manchas) as Manchas
  from defectos
 group by Maquina, Month(Fecha), MonthName(fecha)
union all
select   Maquina
       , 13 as NumeroMes
       , 'TOTAL' as Mes
       , sum(manchas) as TotalManchas
  from defectos
 group by Maquina

Metiendo todo esto en una tabla derivada, puedo ocultar la columna NumeroMes, pero ordenar por ella:

select Maquina, Mes, Manchas
  from (toda la consulta anterior) a
 order by Maquina, NumeroMes

Correct answer by jachguate on January 19, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP