根据某些条件显示计数

时间:2013-04-01 09:51:31

标签: postgresql postgresql-8.4

几天前我问了一个问题。这是链接。 Count() corresponding to max()

现在使用相同的表(SQL Fiddle),我想检查一个不同的条件

如果第一个问题是关于与状态最大值相关的计数,那么这个问题就是根据每个项目的下一个状态显示计数。

解释

正如您在表user_approval中看到的,appr_prjt_id = 1有3种不同的状态,即10,20,30。下一个状态将是40(每次批准状态增加10),依此类推。那么有可能表明有一个项目的状态等待40?它的计数只能显示在输出中对应于40的状态(不在状态10,20,30,......等)

期望输出:

              10   |    20  |  30   |   40

location1     0    |    0   |   0   |   1

3 个答案:

答案 0 :(得分:1)

不确定the next status will be 40的含义。但假设每次批准后状态增加10,则以下情况应该起作用:

SELECT * 
FROM user_projects pr
WHERE EXISTS (
  SELECT * FROM user_approval ex
  WHERE ex.appr_prjt_id = pr.proj_id
  AND ex.appr_status = 30
  )
AND NOT EXISTS (
  SELECT * FROM user_approval nx
  WHERE nx.appr_prjt_id = pr.proj_id
  AND nx.appr_status >= 40
  );

答案 1 :(得分:1)

您可以使用看起来更像的查询来获取每个下一个状态要求的计数:

select
    sum(case when ua.appr_status = 10 then 1 else 0 end) as app_waiting_20,
    sum(case when ua.appr_status = 20 then 1 else 0 end) as app_waiting_30,
    sum(case when ua.appr_status = 30 then 1 else 0 end) as app_waiting_40
from
    user_approval ua;

这个解决方案的优点是只有一个表扫描,你也可以在查询结果中添加各种其他计数/总和。

答案 2 :(得分:0)

select * from user_approval where appr_status
= (select max(appr_status) from user_approval where appr_status < 40);

SQL小提琴: - http://www.sqlfiddle.com/#!11/f5243/10