🔹 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:
| vendedor | monto | categoria |
|---|---|---|
| Ana | 500 | Baja |
| Juan | 800 | Alta |
| Laura | 300 | Baja |
| Pedro | 900 | Alta |
| Sofía | 400 | Baja |
| Diego | 700 | Alta |
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):
| vendedor | monto | posicion |
|---|---|---|
| Pedro | 900 | 1 |
| Juan | 800 | 2 |
| Diego | 700 | 3 |
| Ana | 500 | 4 |
| Sofía | 400 | 5 |
| Laura | 300 | 6 |
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:
| vendedor | ciudad | monto | pos_ciudad |
|---|---|---|---|
| Sofía | Barcelona | 400 | 1 |
| Laura | Barcelona | 300 | 2 |
| Pedro | Madrid | 900 | 1 |
| Juan | Madrid | 800 | 2 |
| Diego | Madrid | 700 | 3 |
| Ana | Madrid | 500 | 4 |
🔹 Ejercicio práctico
- Clasifica cada venta como «Mayor o igual a 600» o «Menor a 600» usando
CASE. - Muestra el ranking de vendedores por monto total (
RANK). - Numera las ventas dentro de cada ciudad (
ROW_NUMBERconPARTITION 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?
🔹 Resumen de la lección
CASEsirve para crear columnas condicionales en una consulta.- Las funciones de ventana permiten analizar datos fila por fila con más detalle.
ROW_NUMBERnumera filas de manera única.RANKasigna rangos, permitiendo empates.PARTITION BYdivide 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.