Resumen

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.