Cómo crear matrices con SUM(IF) en MySQL
Clase 22 de 24 • Curso de SQL y MySQL 2018
Contenido del curso
CREATE
INSERT
Bash y archivos SQL
SELECT
Consultas en MySQL
Contenido Bonus
Domina consultas agregadas con inteligencia de columnas en MySQL y convierte tus datos en información accionable. Aquí verás cómo construir un super query con condicionales, segmentar por rangos de año y combinarlo con nacionalidad mediante JOIN para lograr una matriz clara y útil.
¿Cómo construir un super query con condicionales en MySQL?
Crear inteligencia en las columnas con condicionales permite contar y sumar por categorías en una sola pasada. La clave es usar SUM con IF para transformar condiciones en contadores binarios.
- Usa COUNT sobre la llave primaria para precisión: COUNT(book_id). Evita COUNT(*), aunque en consultas simples es equivalente.
- Normaliza datos antes de agrupar: por ejemplo, reemplazar ENG por GBR en nationality con UPDATE. Esto evita duplicados por códigos distintos.
Ejemplos prácticos:
-- Normalización de nacionalidad
display SELECT DISTINCT nationality FROM authors;
UPDATE authors SET nationality = 'GBR' WHERE nationality = 'ENG';
-- Conteo total de libros (197)
SELECT COUNT(book_id) AS total FROM books;
-- Suma de precios de libros vendibles
SELECT SUM(price) AS total_vendibles FROM books WHERE sellable = 1; -- 4398
-- Valor de inventario: precio por copias
SELECT SUM(price * copies) AS valor_inventario FROM books; -- 17552
Habilidad clave: con SUM(IF(condición,1,0)) conviertes reglas en totales por categoría sin múltiples consultas.
-- Matriz de rangos de año como columnas
SELECT
COUNT(book_id) AS total,
SUM(IF(year < 1950, 1, 0)) AS antes_1950, -- 179
SUM(IF(year >= 1950 AND year < 1990, 1, 0)) AS de_1950_1989, -- 7
SUM(IF(year >= 1990 AND year < 2000, 1, 0)) AS de_1990_1999, -- 8
SUM(IF(year >= 2000, 1, 0)) AS desde_2000 -- 3
FROM books;
-- Totales: 179 + 7 + 8 + 3 = 197
¿Cómo crear una matriz por año y nacionalidad con SUM(IF) y GROUP BY?
La matriz cruza renglones por nacionalidad y columnas por rangos de año. Esto se logra con JOIN entre authors y books, y GROUP BY nationality.
SELECT
a.nationality,
COUNT(b.book_id) AS total,
SUM(IF(b.year < 1950, 1, 0)) AS antes_1950,
SUM(IF(b.year >= 1950 AND b.year < 1990, 1, 0)) AS de_1950_1989,
SUM(IF(b.year >= 1990 AND b.year < 2000, 1, 0)) AS de_1990_1999,
SUM(IF(b.year >= 2000, 1, 0)) AS desde_2000
FROM books AS b
JOIN authors AS a ON a.author_id = b.author_id
WHERE a.nationality IS NOT NULL
GROUP BY a.nationality;
- Con este patrón, cada condición en SUM(IF) es una columna. Fácil de leer y exportar.
- Útil para segmentar por país, idioma, vendible, o cualquier atributo disponible.
- Extensible: cambia límites de año o agrega más rangos sin reescribir múltiples consultas.
¿Cómo asegurar datos limpios antes del agrupamiento?
- Estandariza códigos con UPDATE para evitar categorías duplicadas.
- Valida nulos con WHERE nationality IS NOT NULL.
- Revisa DISTINCT antes de agrupar para detectar inconsistencias.
¿Por qué este enfoque es eficiente?
- El motor ya recorre las tuplas por el JOIN y el GROUP BY.
- Cada SUM(IF) agrega una operación binaria simple por fila.
- A escala moderada, la latencia es mínima y el resultado es inmediato.
¿Qué buenas prácticas y próximos pasos potenciarán tus consultas?
Pequeñas decisiones mejoran claridad, rendimiento y mantenibilidad.
- Prefiere COUNT(book_id) para evitar ambigüedades.
- Usa SUM para agregar métricas derivadas: price*copies, conversiones, factores (de millas a kilómetros, etc.).
- Segmenta con SUM(IF) en columnas para matrices compactas.
- Define rangos coherentes y no solapados: <1950, 1950–1989, 1990–1999, ≥2000.
- Separa responsabilidades: si la capa de datos puede ofrecer información lista para negocio, hazlo con vistas o consultas agregadas.
- Considera respaldos y versionado con la utilidad externa mysql_dump para proteger y rastrear cambios en la base de datos.
¿Quieres que armemos una variante con otros rangos, más atributos (como idioma o vendible) o una vista materializada para tu caso? Comparte en comentarios qué dimensión te interesa cruzar y lo construimos juntos.