Re: Doing a conditional aggregate (e.g. count(*) if x=y) in postgres?
От | Geoff Tolley |
---|---|
Тема | Re: Doing a conditional aggregate (e.g. count(*) if x=y) in postgres? |
Дата | |
Msg-id | 4648EE4F.3040005@polimetrix.com обсуждение исходный текст |
Ответ на | Doing a conditional aggregate (e.g. count(*) if x=y) in postgres? (Bryce Nesbitt <bryce1@obviously.com>) |
Ответы |
Re: Doing a conditional aggregate (e.g. count(*) if x=y) in
postgres?
|
Список | 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 = 20THEN 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.statusIN (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
В списке pgsql-sql по дате отправления: