I have following query in 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;
Why do I get this error:
ERROR: column “overall_count” does not exist
My table structure:
License(license_id, license_name, limit_call, create_date, expire_date)
Log(log_id, license_id, log, call_date)
I want to check if a license has reached the limit for calls in a specific month.
Since Postgres 9.1 the primary key covers all columns of a table in the
GROUP BYclause. In older versions you’d have to adda.limit_callto theGROUP BYlist. The release notes for 9.1:Further reading:
The condition you had in the
WHEREclause has to move to theHAVINGclause since it refers to the result of an aggregate function (afterWHEREhas been applied). And you cannot refer to output columns (column aliases) in theHAVINGclause, where you can only reference input columns. So you have to repeat the expression. The manual:I reversed the order of tables in the
FROMclause and cleaned up the syntax a bit to make it less confusing.USINGis just a notational convenience here.I used
LEFT JOINinstead ofJOIN, so you do not exclude licenses without any logs at all.Only non-null values are counted by
count(). Since you want to count related entries in table"Log"it is safer and slightly cheaper to usecount(b.license_id). This column is used in the join, so we don’t have to bother whether the column can be null or not.count(*)is even shorter and slightly faster, yet. If you don’t mind to get a count of1for0rows in the left table, use that.Aside: I would advise not to use mixed case identifiers in Postgres if possible. Very error prone.