📘 Lección 18: CASE y funciones de ventana

🔹 Introducción

En SQL no solo podemos seleccionar, filtrar o agrupar datos.
A veces necesitamos crear columnas calculadas de forma condicional (como un if/else) o analizar filas en relación con otras (numerarlas, sacar rankings, calcular acumulados).

Para eso existen:

  • CASE → permite crear condiciones dentro de una consulta.
  • Funciones de ventana (ROW_NUMBER, RANK, PARTITION BY) → permiten analizar datos fila por fila dentro de un conjunto.

Hoy aprenderás a:

✅ Usar CASE para transformar valores.
✅ Numerar filas con ROW_NUMBER.
✅ Ordenar con RANK.
✅ Separar datos por grupos con PARTITION BY.

🔹 Nuestra tabla de ejemplo

Vamos a trabajar con una tabla de ventas:

CREATE TABLE ventas (
  id INT,
  vendedor VARCHAR(50),
  monto DECIMAL(10,2),
  ciudad VARCHAR(50)
);

INSERT INTO ventas (id, vendedor, monto, ciudad) VALUES
(1, 'Ana',   500, 'Madrid'),
(2, 'Juan',  800, 'Madrid'),
(3, 'Laura', 300, 'Barcelona'),
(4, 'Pedro', 900, 'Madrid'),
(5, 'Sofía', 400, 'Barcelona'),
(6, 'Diego', 700, 'Madrid');

🔹 Parte 1: el comando CASE

Ejemplo 1: clasificar ventas en altas o bajas

SELECT vendedor, monto,
  CASE 
    WHEN monto >= 700 THEN 'Alta'
    ELSE 'Baja'
  END AS categoria
FROM ventas;

👉 Resultado esperado:

vendedormontocategoria
Ana500Baja
Juan800Alta
Laura300Baja
Pedro900Alta
Sofía400Baja
Diego700Alta

Ejemplo 2: múltiples condiciones

SELECT vendedor, monto,
  CASE 
    WHEN monto >= 800 THEN 'Muy Alta'
    WHEN monto >= 500 THEN 'Media'
    ELSE 'Baja'
  END AS categoria
FROM ventas;

👉 Clasifica los montos en tres rangos: Baja, Media y Muy Alta.

🔹 Parte 2: funciones de ventana

Las funciones de ventana no agrupan como GROUP BY.
Analizan fila por fila pero teniendo en cuenta un «marco» de datos.

Ejemplo 3: numerar filas con ROW_NUMBER

SELECT vendedor, monto,
  ROW_NUMBER() OVER(ORDER BY monto DESC) AS posicion
FROM ventas;

👉 Resultado esperado (ordenados por monto de mayor a menor):

vendedormontoposicion
Pedro9001
Juan8002
Diego7003
Ana5004
Sofía4005
Laura3006

Ejemplo 4: ranking con RANK

RANK funciona como ROW_NUMBER, pero si dos valores son iguales, les da el mismo rango y saltea el siguiente.

SELECT vendedor, monto,
  RANK() OVER(ORDER BY monto DESC) AS ranking
FROM ventas;

👉 Si hubiera dos montos iguales, compartirían el mismo ranking.

Ejemplo 5: PARTITION BY para separar grupos

Queremos calcular la posición de cada vendedor dentro de su ciudad.

SELECT vendedor, ciudad, monto,
  ROW_NUMBER() OVER(PARTITION BY ciudad ORDER BY monto DESC) AS pos_ciudad
FROM ventas;

👉 Resultado esperado:

vendedorciudadmontopos_ciudad
SofíaBarcelona4001
LauraBarcelona3002
PedroMadrid9001
JuanMadrid8002
DiegoMadrid7003
AnaMadrid5004

🔹 Ejercicio práctico

  1. Clasifica cada venta como «Mayor o igual a 600» o «Menor a 600» usando CASE.
  2. Muestra el ranking de vendedores por monto total (RANK).
  3. Numera las ventas dentro de cada ciudad (ROW_NUMBER con PARTITION BY).

🔹 Soluciones

-- 1. Clasificación simple
SELECT vendedor, monto,
  CASE WHEN monto >= 600 THEN 'Mayor o igual a 600' ELSE 'Menor a 600' END AS categoria
FROM ventas;

-- 2. Ranking por monto
SELECT vendedor, monto,
  RANK() OVER(ORDER BY monto DESC) AS ranking
FROM ventas;

-- 3. Ranking por ciudad
SELECT vendedor, ciudad, monto,
  ROW_NUMBER() OVER(PARTITION BY ciudad ORDER BY monto DESC) AS pos_ciudad
FROM ventas;

🔹 Mini Quiz

 

Resultados

#1. ¿Qué hace la cláusula PARTITION BY en una función de ventana?

Previa
Finalizar

🔹 Resumen de la lección

  • CASE sirve para crear columnas condicionales en una consulta.
  • Las funciones de ventana permiten analizar datos fila por fila con más detalle.
  • ROW_NUMBER numera filas de manera única.
  • RANK asigna rangos, permitiendo empates.
  • PARTITION BY divide los resultados en grupos para aplicar la función dentro de cada grupo.

👉 En la próxima lección empezaremos el Proyecto: Base de datos de biblioteca, donde pondrás en práctica todo lo aprendido creando tablas, relaciones y consultas reales.

📚 Esta lección es parte de una serie educativa. Consulta el índice en el Curso SQL.

Scroll al inicio