From: | "Tomas Vondra" <tv(at)fuzzy(dot)cz> |
---|---|
To: | janek12(at)web(dot)de |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: Sum of columns |
Date: | 2013-09-09 02:16:33 |
Message-ID: | ddb369ede4fe52fe049696214e64f604.squirrel@sq.gransy.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 9 Září 2013, 3:12, janek12(at)web(dot)de wrote:
> Hi, this is my query: SELECT user, sum(CASE WHEN lev >= 50
> AND lev < 70 THEN 1 ELSE 0 END) as a,
> sum(CASE WHEN lev >= 70 AND lev < 80 THEN 1 ELSE 0 END) as b,
> sum(CASE WHEN lev >= 80 AND lev 90 THEN 1 ELSE 0 END) as d,
> (SELECT a + b + a + d) AS matches
> FROM t_temp_fts
> GROUP BY user' I like to add up the 4 columns a,b,c and d
> of every user, but it doesn't work like this. Does anyone
> know a solution Janek Sendrowski
Hi,
it doesn't work like that - the inner select makes no sense for various
reasons. I'd bet what you want is something this:
SELECT user, a, b, d, (a + b + d) AS matches
FROM (
SELECT user,
sum(CASE WHEN lev >= 50 AND lev < 70 THEN 1 ELSE 0 END) as a,
sum(CASE WHEN lev >= 70 AND lev < 80 THEN 1 ELSE 0 END) as b,
sum(CASE WHEN lev >= 80 AND lev < 90 THEN 1 ELSE 0 END) as d,
FROM t_temp_fts
GROUP BY user
) foo
i.e. it takes the t_temp_fts table, computes the partial results and then
passes the results to the outer query to evaluate the addition.
There's an alternative doing all of that in a single query:
SELECT user, a, b, d, (a + b + d) AS matches
FROM (
SELECT user,
sum(CASE WHEN lev >= 50 AND lev < 70 THEN 1 ELSE 0 END) as a,
sum(CASE WHEN lev >= 70 AND lev < 80 THEN 1 ELSE 0 END) as b,
sum(CASE WHEN lev >= 80 AND lev < 90 THEN 1 ELSE 0 END) as d,
sum(CASE WHEN lev >= 50 AND lev < 70 THEN 1 ELSE 0 END) +
sum(CASE WHEN lev >= 70 AND lev < 80 THEN 1 ELSE 0 END) +
sum(CASE WHEN lev >= 80 AND lev < 90 THEN 1 ELSE 0 END) as matches,
FROM t_temp_fts
GROUP BY user
) foo
or you could add directly the CASE statements like this:
SELECT user, a, b, d, (a + b + d) AS matches
FROM (
SELECT user,
sum(CASE WHEN lev >= 50 AND lev < 70 THEN 1 ELSE 0 END) as a,
sum(CASE WHEN lev >= 70 AND lev < 80 THEN 1 ELSE 0 END) as b,
sum(CASE WHEN lev >= 80 AND lev < 90 THEN 1 ELSE 0 END) as d,
sum((CASE WHEN lev >= 50 AND lev < 70 THEN 1 ELSE 0 END) +
(CASE WHEN lev >= 70 AND lev < 80 THEN 1 ELSE 0 END) +
(CASE WHEN lev >= 80 AND lev < 90 THEN 1 ELSE 0 END)) as
matches,
FROM t_temp_fts
GROUP BY user
) foo
All of this should return return the same results.
Tomas
From | Date | Subject | |
---|---|---|---|
Next Message | Rob Sargentg | 2013-09-09 02:27:50 | Re: Sum of columns |
Previous Message | Chris Curvey | 2013-09-09 01:29:45 | Re: Sum of columns |