Cuando usamos datos en bruto las condiciones de cuales datos queremos obtener las colocamos a continuación de la cláusula WHERE. Sin embargo, no podemos hacer eso mismo con los datos agrupados ya que escribir algo como esto:

SELECT
   PRD_PROCED,
   COUNT(*)
FROM
   PRODUCTOS
WHERE
   COUNT(*) >= 10
GROUP BY
   PRD_PROCED

generará un error ¿por qué? Porque la cláusula GROUP BY siempre se debe escribir después que la cláusula WHERE y por lo tanto el Firebird aún no conoce el valor de COUNT(*) cuando está en la cláusula WHERE.

¿Cuál es la solución a este problema? Usar la cláusula HAVING, la cual pone condiciones a los datos agrupados. Así como la cláusula WHERE pone condiciones a los datos en bruto, la cláusula HAVING pone condiciones a los datos agrupados. Y así como WHERE se usa después que las columnas, HAVING se usa después que GROUP BY.

SELECT
   PRD_PROCED,
   COUNT(*)
FROM
   PRODUCTOS
GROUP BY
   PRD_PROCED
HAVING
   COUNT(*) >= 10

Cuando el Firebird encuentra la cláusula HAVING ya conoce el valor de COUNT(*) y por lo tanto puede filtrar los datos.

.