Módulo 5 · Consultas avanzadas

Práctica: combina UNION, CASE y funciones

Construye un informe a partir de dos fuentes distintas sin perder el significado de cada fila: alinea columnas, clasifica con CASE y normaliza texto antes de combinar.

34 minNivel repasoAntes necesitas: UNION, CASE y funciones de texto

0 de 45 lecciones

Al terminar, podrás

  • Decidir qué columnas deben tener la misma función antes de usar UNION ALL.
  • Crear una etiqueta con CASE dentro de cada consulta sin mezclar reglas de tablas distintas.
  • Aplicar LOWER() para presentar texto con un formato común.
  • Comprobar el resultado compuesto antes de dar una consulta por terminada.

Recupera lo aprendido: ¿Por qué los dos SELECT de UNION ALL deben tener el mismo número de columnas?

La idea clave: diseña primero la forma del resultado

Cuando combinas consultas no basta con que cada SELECT funcione por separado. Los dos bloques deben devolver el mismo número de columnas y cada posición debe representar el mismo tipo de dato o un tipo compatible. Por eso conviene empezar dibujando el resultado que quieres obtener.

Objetivo del informe

Queremos tres columnas: origen, nombre y grupo. El origen identifica de qué tabla procede la persona, el nombre se presenta en minúsculas y el grupo aplica una regla distinta según la fuente.

Planifica antes de escribir

  1. Fija las columnas finales. Ambos bloques devolverán origen, nombre y grupo, en ese orden.
  2. Resuelve cada fuente por separado. En clientes, el grupo depende de la ciudad; en empleados, del departamento.
  3. Normaliza la presentación. LOWER(nombre) evita que un bloque entregue nombres con un formato distinto al otro.
  4. Combina al final. Usa UNION ALL porque quieres conservar todas las filas de las dos fuentes.
  5. Ordena el resultado compuesto. El ORDER BY final debe describir cómo quieres leer el informe completo.

Ejemplo guiado: comprueba primero la estructura

Antes de añadir clasificaciones y funciones, verifica que los dos bloques producen columnas equivalentes:

SQL
SELECT 'cliente' AS origen, nombre
FROM clientes
WHERE ciudad = 'Madrid'
UNION ALL
SELECT 'empleado' AS origen, nombre
FROM empleados
WHERE departamento = 'Ventas'
ORDER BY origen, nombre;
Resultado esperado del ejemplo
origennombre
clienteAna Torres
clienteMarta Ruiz
clienteNoa Vidal
clientePablo Sanz
empleadoAlex Ramos
empleadoBea Molina
empleadoIsmael Díaz

Las dos consultas devuelven exactamente dos columnas con el mismo significado. Esa comprobación reduce mucho los errores cuando después añades expresiones más largas.

Comprueba tu comprensión

¿Qué debes decidir antes de combinar dos SELECT?

Un error habitual

Aplicar una regla después de perder su contexto

Idea correcta
SELECT ...,
       CASE WHEN ciudad = 'Madrid'
            THEN 'prioridad'
            ELSE 'resto'
       END AS grupo
FROM clientes
UNION ALL
SELECT ...,
       CASE WHEN departamento = 'Ventas'
            THEN 'prioridad'
            ELSE 'resto'
       END AS grupo
FROM empleados;

Si primero mezclas datos de clientes y empleados y después intentas evaluar ciudad o departamento, esas columnas ya no forman parte de una estructura común. Calcula el CASE dentro del bloque que conoce esa columna y combina después el valor resultante.

Practica con datos

Laboratorio SQL

Construye un directorio priorizado

Pendiente

Combina con UNION ALL todos los clientes y empleados. Devuelve origen ('cliente' o 'empleado'), nombre en minúsculas y grupo ('prioridad' para clientes de Madrid o empleados de Ventas, y 'resto' en los demás casos). Ordena por grupo, origen y nombre.

Resultado esperado: 22 filas con origen, nombre y grupo; 7 de prioridad y 15 del resto, ordenadas por grupo, origen y nombre.

Ver tablas y datos

Cargando la estructura del ejercicio…

La consulta usa datos ficticios y se ejecuta solo en este navegador.

Ronda autónoma: cambia la regla, conserva la estructura

Crea un directorio por área

Devuelve tipo, nombre y area. Para clientes, area será su ciudad; para empleados, su departamento. Convierte los nombres a mayúsculas con UPPER(), conserva todas las filas con UNION ALL y ordena por tipo y nombre.

Ver una pista

Las columnas ciudad y departamento tienen nombres distintos, pero en el resultado cumplen la misma función. El alias area puede definirse en el primer SELECT.

Ver una solución posible
SQL
SELECT 'cliente' AS tipo,
       UPPER(nombre) AS nombre,
       ciudad AS area
FROM clientes
UNION ALL
SELECT 'empleado',
       UPPER(nombre),
       departamento
FROM empleados
ORDER BY tipo, nombre;

Lo importante es que cada posición conserve el mismo significado: tipo, nombre y área.

Si te bloqueas, vuelve a la pregunta “¿filas o columnas?”

  1. Si necesitas añadir columnas de tablas relacionadas, probablemente estás ante un JOIN.
  2. Si necesitas apilar filas que comparten una estructura, repasa UNION y UNION ALL.
  3. Si una columna depende de una condición, repasa CASE.
  4. Si solo quieres cambiar cómo se presenta un texto, vuelve a funciones de texto y fechas.

Separar estas decisiones evita consultas difíciles de leer: primero define la forma, después calcula cada columna y solo al final combina.

Fuentes técnicas consultadas

La práctica utiliza un subconjunto común y contrastado en documentación oficial. En particular, UNION ALL conserva las filas de ambos bloques; CASE es una expresión condicional; y LOWER() transforma texto según las reglas de cada motor.

Comprueba si puedes explicarlo

Si una persona aparece como cliente y como empleado, ¿debemos eliminar una de las filas de este informe?

Ver respuesta razonada

No. Cada fila representa a una persona en un origen concreto. UNION ALL conserva ambas participaciones y origen permite distinguirlas. El criterio de duplicado depende de la pregunta.

Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.

Qué debes recordar

  • Diseña primero las columnas finales y mantén el mismo significado en cada posición.
  • Calcula las reglas específicas de cada fuente antes de combinar.
  • Usa UNION ALL cuando quieras conservar todas las filas.
  • Aplica el ORDER BY al resultado compuesto, no a un bloque aislado.
  • Comprueba datos y orden: una consulta puede ser válida y aun así responder mal a la pregunta.

Conceptos relacionados