Google Web

16 sept. 2008

No more UNION

El día de hoy quiero compartir con ustedes un hallazgo de esas funciones místicas (si Pimienta, es místico esto) de MySQL. Se trata del keyword ROLLUP de GROUP BY. Qué es esto y como funciona? Supongamos el siguiente ejemplo:

SELECT NombreCliente, SUM(MontoPago) FROM Clientes GROUP BY NombreCliente

Ahorrando los detalles de que era habia un JOIN en Clientes y Pagos. Tenemos un listado con la suma de los pagos por cliente, pues bien, si queriamos tener un gran total de esto la gente era tonta y en lenguaje de programación hacian una suma de las sumas de pagos (he visto mucho código así, lo juro). Otros menos torpes como yo, usamos el famoso UNION para agregar un NULL como NombreCliente y sumar todo. Ok nada novedoso para muchos, pero bueno MySQL trae un nivel bastante agradable para mejorar esto.

SELECT NombreCliente, SUM(MontoPago) FROM Clientes GROUP BY NombreCliente
UNION
SELECT NULL as NombreCliente, SUM(MontoPago) FROM Clientes

Usando ROLL UP tenemos:

SELECT NombreCliente, SUM(MontoPago) FROM Clientes GROUP BY NombreCliente WITH ROLLUP

Lo que nos da el mismo resultado, y es hermoso. Claro este SELECT no tiene complicaciones, pero cuando tienes un SELECT construido para generar un pivote dinámico, tienes complicaciones existenciales más importantes que reflejar los JOINS y clausulas del UNION.

Espero que le ayude a alguién este tip, que a mi la verdad me sirvió de mucho!

EDIT: A lo que preguntaron por messenger, si en SQL Server al parecer si existe la palabra clave ROLLUP, se maneja igual según MSDN, más no lo he checado.