A veces necesitamos responder a preguntas que incluyen a las palabras “todos” o “en cada uno”. Por ejemplo:

  • Los productos que se vendieron todos los días
  • Los alumnos que rindieron todos los exámenes
  • Los empleados que trabajaron todos los días

¿Cómo podemos solucionarlo?

Una alternativa es mediante el uso de las cláusulas GROUP BY y HAVING.

La idea es: primero, hallar la cantidad total de alternativas distintas, y luego hallar quienes tienen esa cantidad

Ejemplo:

Tenemos una tabla llamada MOVIMCAB (cabecera de movimientos) donde guardamos, entre otros datos, la fecha de cada venta y el identificador del vendedor que realizó la venta. Y nos interesa responder a la pregunta: ¿cuáles vendedores vendieron todos los días?

TODOS1

Captura 1. Si haces clic en la imagen la verás más grande

En casos así lo mejor es dividir el problema en 3 partes:

  1. Hallar la cantidad de fechas distintas
  2. Hallar la cantidad de fechas distintas en que cada vendedor ha vendido
  3. Comparar ambas cantidades

Paso 1. Hallando la cantidad de fechas distintas

Listado 1.

SELECT
   COUNT(DISTINCT MVC_FECHAX)
FROM
   MOVIMCAB

TODOS2

Captura 2. Si haces clic en la imagen la verás más grande

Al ejecutar el Listado 1. vemos que hay 3 fechas distintas en la tabla MOVIMCAB.

Paso 2. Hallando la cantidad de fechas distintas que cada vendedor ha vendido

Listado 2.

SELECT
   MVC_IDEVEN,
   COUNT(DISTINCT MVC_FECHAX)
FROM
   MOVIMCAB
GROUP BY
   MVC_IDEVEN

TODOS3

Captura 3. Si haces clic en la imagen la verás más grande

Al ejecutar el Listado 2. vemos la cantidad de fechas distintas en que cada vendedor ha vendido.

Paso 3. Comparando ambas cantidades

Listado 3.

SELECT
   MVC_IDEVEN,
   COUNT(DISTINCT MVC_FECHAX)
FROM
   MOVIMCAB
GROUP BY
   MVC_IDEVEN
HAVING
   COUNT(DISTINCT MVC_FECHAX) = (SELECT COUNT(DISTINCT MVC_FECHAX) FROM MOVIMCAB)

TODOS4

Captura 4. Si haces clic en la imagen la verás más grande

Al ejecutar el Listado 3. obtenemos la Captura 4. que nos dice que los vendedores cuyos identificadores son 1 y 7 han vendido todos los días, y que hay 3 días distintos.

Explicación:

En la cláusula HAVING del Listado 3. comparamos la cantidad de fechas distintas que ha vendido cada vendedor con la cantidad de fechas distintas que tenemos en la tabla MOVIMCAB. Si ambas cantidades son iguales entonces evidentemente ese vendedor ha vendido en todas las fechas.

Artículos relacionados:

Entendiendo la cláusula GROUP BY: agrupando datos

La claúsula GROUP BY requiere estar ordenada

La claúsula HAVING: filtrando las filas agrupadas

El índice del blog Firebird21

El foro del blog Firebird21