Tema SQL
FILTER en agregados (PostgreSQL)
Cláusula estándar SQL que limita qué filas entran en cada agregado sin añadir subconsultas. count(*) FILTER (WHERE cond) es idiomático.
Descripción
AGG(expr) FILTER (WHERE predicado) calcula el agregado solo sobre filas que cumplen el predicado en el mismo GROUP BY. Permite múltiples conteos condicionados en una pasada. Equivalente a SUM(CASE WHEN …) pero más claro. Soportado también en otros motores modernos; MySQL 8+ admite FILTER en algunos contextos.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
COUNT(*) FILTER (WHERE estado = 'ok')
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Varios agregados
- Varios FILTER en el mismo SELECT agrupado.
Ejemplos
Ejemplo 1
SELECT depto,
COUNT(*) FILTER (WHERE salario > 50000) AS altos,
COUNT(*) FILTER (WHERE baja IS NOT NULL) AS bajas
FROM empleados
GROUP BY depto;
Ejemplo 2
SELECT cliente_id,
SUM(importe) FILTER (WHERE estado = 'pagado') AS pagado,
SUM(importe) FILTER (WHERE estado = 'pendiente') AS pendiente
FROM facturas
GROUP BY cliente_id;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.