几天前我问了一个问题。这是链接。 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
答案 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