procedimientos linea funciones espaƱol desde datos consultas con comandos cero bases aprender administraciĆ³n sql postgresql group-by having

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áusula GROUP BY . A partir de la versión 9.1 es suficiente tener la clave principal en la cláusula GROUP 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áusula GROUP BY

  • Su condición WHERE tiene que pasar a la cláusula HAVING 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áusula HAVING , 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 y GROUP BY , pero no en las cláusulas WHERE o HAVING ; 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 de JOIN , 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 la count(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 de 1 por 0 filas en la tabla de la izquierda, úselo.