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_calla 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 BYen la lista de destino de consulta cuando la clave principal se especifique en la cláusulaGROUP BYSu condición
WHEREtiene que pasar a la cláusulaHAVINGya 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 BYyGROUP BY, pero no en las cláusulasWHEREoHAVING; Allí debes escribir la expresión en su lugar.Revirtí el orden de las tablas en la cláusula
FROMy limpié la sintaxis un poco para hacerlo menos confuso.USINGes sólo una conveniencia de notación aquí.Utilicé
LEFT JOINlugar 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 de1por0filas en la tabla de la izquierda, úselo.