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
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
Es posible mostrar los totales por cada maquina, es decir de la siguiente forma (ejemplo realizado en excel para efectos prácticos)
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
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP