Re: Doing a conditional aggregate (e.g. count(*) if x=y) in postgres?

From: Geoff Tolley <geoff(at)polimetrix(dot)com>
To: Bryce Nesbitt <bryce1(at)obviously(dot)com>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: Doing a conditional aggregate (e.g. count(*) if x=y) in postgres?
Date: 2007-05-14 23:18:39
Message-ID: 4648EE4F.3040005@polimetrix.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Bryce Nesbitt wrote:
> All;
> Is there a way to get a conditional aggregate? I have this two column view:
>
> SELECT count(*) AS count, xx_plan.plan_name
> FROM xx_membership
> JOIN xx_account USING (account_id)
> JOIN xx_plan USING (plan_id)
> WHERE xx_membership.status = 10
> GROUP BY xx_plan.plan_name;
>
> And would like to add additional columns (not rows) breaking out
> "status=20" and "status=30" totals.
> Is this possible without a stored procedure?

SELECT sum(CASE WHEN xx_membership.status = 10 THEN 1 ELSE 0 END) AS sum10,
sum(CASE WHEN xx_membership.status = 20 THEN 1 ELSE 0 END) AS sum20,
sum(CASE WHEN xx_membership.status = 30 THEN 1 ELSE 0 END) AS sum30,
xx_plan.plan_name
FROM xx_membership
JOIN xx_account USING (account_id)
JOIN xx_plan USING (plan_id)
WHERE xx_membership.status IN (10,20,30)
GROUP BY xx_plan.plan_name;

You may or may not care about including the WHERE clause there depending
upon its selectivity and whether there's an index for the planner to use.

HTH,
Geoff

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Bryce Nesbitt 2007-05-14 23:48:06 Re: Doing a conditional aggregate (e.g. count(*) if x=y) in postgres?
Previous Message Jim Buttafuoco 2007-05-14 23:16:14 Re: Doing a conditional aggregate (e.g. count(*) if x=y) in postgres?