Aggregate functions not allowed in WHERE clause

Started by Ricardo Naranjo Faccinialmost 20 years ago5 messagesgeneral
Jump to latest
#1Ricardo Naranjo Faccini
gramo.gnu@gmail.com

I have two tables, Claims and Logs, and I need to fish in for the id of
any
claim who have into the logs anything into the fields invoices or
payments

I think the best way to do this is by mean of:

SELECT claim_id
FROM logs
WHERE (
sum(logs.invoices) > 0
OR
sum(logs.payments) > 0
)
GROUP BY claim_id

But Postgres claims "Aggregate functions not allowed in WHERE clause"

Anyone could help me to figure out this task please

Cordially
--
@..@ Ricardo Naranjo Faccini Tel: (1) 257-9832
(----) Ingeniero Civil Calle 95 #30-61 int 8
( >__< ) M.Sc. Ing. de Sistemas y Comp. Barrio La Castellana
^^ ~~ ^^ gerencia@skinait.com Bogot� D.C.
SKINA Colombia, S.A.
IT Solutions http://www.skinait.com

#2Chris Browne
cbbrowne@acm.org
In reply to: Ricardo Naranjo Faccini (#1)
Re: Aggregate functions not allowed in WHERE clause

Quoth gramo.gnu@gmail.com (Ricardo Naranjo Faccini):

I have two tables, Claims and Logs, and I need to fish in for the id of
any
claim who have into the logs anything into the fields invoices or
payments

I think the best way to do this is by mean of:

SELECT claim_id
FROM logs
WHERE (
sum(logs.invoices) > 0
OR
sum(logs.payments) > 0
)
GROUP BY claim_id

But Postgres claims "Aggregate functions not allowed in WHERE clause"

Anyone could help me to figure out this task please

You might consider using a HAVING clause to add those constraints at
the grouping level...

select claim_id
from logs
group by claim_id
having sum(logs.invoices) > 0 or sum(logs.payments) > 0;

You might need to have those sums in the outer select...
--
(reverse (concatenate 'string "ofni.secnanifxunil" "@" "enworbbc"))
http://linuxfinances.info/info/finances.html
"Microsoft has world class quality control" -- Arthur Norman

#3Michael Fuhr
mike@fuhr.org
In reply to: Ricardo Naranjo Faccini (#1)
Re: Aggregate functions not allowed in WHERE clause

On Mon, Jun 12, 2006 at 09:00:33PM -0500, Ricardo Naranjo Faccini wrote:

SELECT claim_id
FROM logs
WHERE (
sum(logs.invoices) > 0
OR
sum(logs.payments) > 0
)
GROUP BY claim_id

But Postgres claims "Aggregate functions not allowed in WHERE clause"

I think you're looking for HAVING. Does the following do what you
want?

SELECT claim_id
FROM logs
GROUP BY claim_id
HAVING sum(invoices) > 0 OR sum(payments) > 0;

--
Michael Fuhr

#4pradeep singh
lets_begin_with_me@yahoo.com
In reply to: Michael Fuhr (#3)
Re: Aggregate functions not allowed in WHERE clause

i think this query can be rewritten as

SELECT claim_id,sum(invoices),sum(payments)
FROM logs
GROUP BY claim_id
HAVING sum(invoices) > 0 OR sum(payments) > 0;

having clause can be used with aggregate functions but
those functions should be the part of column
list/expression list in the SELECT statement.

pradeep

--- Michael Fuhr <mike@fuhr.org> wrote:

On Mon, Jun 12, 2006 at 09:00:33PM -0500, Ricardo
Naranjo Faccini wrote:

SELECT claim_id
FROM logs
WHERE (
sum(logs.invoices) > 0
OR
sum(logs.payments) > 0
)
GROUP BY claim_id

But Postgres claims "Aggregate functions not

allowed in WHERE clause"

I think you're looking for HAVING. Does the
following do what you
want?

SELECT claim_id
FROM logs
GROUP BY claim_id
HAVING sum(invoices) > 0 OR sum(payments) > 0;

--
Michael Fuhr

---------------------------(end of
broadcast)---------------------------
TIP 6: explain analyze is your friend

__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

#5Michael Fuhr
mike@fuhr.org
In reply to: pradeep singh (#4)
Re: Aggregate functions not allowed in WHERE clause

On Mon, Jun 12, 2006 at 08:40:29PM -0700, pradeep singh wrote:

i think this query can be rewritten as

SELECT claim_id,sum(invoices),sum(payments)
FROM logs
GROUP BY claim_id
HAVING sum(invoices) > 0 OR sum(payments) > 0;

having clause can be used with aggregate functions but
those functions should be the part of column
list/expression list in the SELECT statement.

PostgreSQL has no such requirement; see "The GROUP BY and HAVING
Clauses" in the documentation:

http://www.postgresql.org/docs/8.1/interactive/queries-table-expressions.html#QUERIES-GROUP

"Tip: Grouping without aggregate expressions effectively calculates
the set of distinct values in a column."

"Note that the aggregate expressions do not necessarily need to be
the same in all parts of the query."

Offhand I don't know if the SQL standard requires expressions in
the HAVING clause to be present in the select list -- can you cite
reference from the standard that supports the assertion that they
should be?

--
Michael Fuhr