linea - PostgreSQL donde cuenta condicion
linea de comandos postgresql (2)
La consulta where
no reconoce su alias de columna y, además, está intentando filtrar filas después de la agregación. Tratar:
SELECT
COUNT(a.log_id) AS overall_count
FROM
"Log" as a,
"License" as b
WHERE
a.license_id=7
AND
a.license_id=b.license_id
GROUP BY
a.license_id
having b.limit_call > count(a.log_id);
La cláusula having
es similar a la cláusula where
, excepto que se trata de columnas después de una agregación, mientras que la cláusula where
funciona en columnas antes de una agregación.
Además, ¿existe alguna razón por la que los nombres de sus tablas estén entre comillas dobles?
Tengo la siguiente consulta en PostgreSQL:
SELECT
COUNT(a.log_id) AS overall_count
FROM
"Log" as a,
"License" as b
WHERE
a.license_id=7
AND
a.license_id=b.license_id
AND
b.limit_call > overall_count
GROUP BY
a.license_id;
¿Por qué me sale este error:
ERROR: la columna "overall_count" no existe
La estructura de mi mesa:
License(license_id, license_name, limit_call, create_date, expire_date)
Log(log_id, license_id, log, call_date)
Quiero verificar si una licencia ha alcanzado el límite para llamadas en un mes específico.
SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
Puntos principales
En las versiones anteriores a PostgreSQL 9.1, debe agregar
limit_call
a la cláusulaGROUP BY
. A partir de la versión 9.1 es suficiente tener la clave principal en la cláusulaGROUP BY
. Las notas de lanzamiento de 9.1 nos dicen:Permitir columnas que no sean de
GROUP BY
en la lista de destino de consulta cuando la clave principal se especifique en la cláusulaGROUP BY
Su condición
WHERE
tiene que pasar a la cláusulaHAVING
ya que se refiere al resultado de una función agregada. Y no puede hacer referencia a las columnas de salida (alias de columna) en la cláusulaHAVING
, donde solo puede hacer referencia a las columnas de entrada. Así que hay que repetir la expresión. Por documentación:El nombre de una columna de salida se puede usar para referirse al valor de la columna en las cláusulas
ORDER BY
yGROUP BY
, pero no en las cláusulasWHERE
oHAVING
; Allí debes escribir la expresión en su lugar.Revirtí el orden de las tablas en la cláusula
FROM
y limpié la sintaxis un poco para hacerlo menos confuso.USING
es sólo una conveniencia de notación aquí.Utilicé
LEFT JOIN
lugar deJOIN
, por lo que no excluye las licencias sin ningún tipo de registro.Recomendaría no utilizar identificadores de casos mixtos en Postgres si es posible. Muy propenso a errores.
Solo los valores que no son nulos se cuentan por
count()
. Dado que desea contar entradas relacionadas en la tabla"Log"
, es más seguro y un poco más barato usar lacount(b.license_id)
. Esta columna se utiliza en la unión, por lo que no tenemos que preocuparnos de si la columna puede ser nula o no.
count(*)
sería aún más corto y un poco más rápido, aún. Si no importa obtener un conteo de1
por0
filas en la tabla de la izquierda, úselo.