1

前几天我问了一个问题。这是那个链接。 与max()对应的count()

现在使用同一组表(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
4

3 回答 3

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
  );
于 2013-04-01T10:47:24.840 回答
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;

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

于 2013-04-14T05:22:12.763 回答
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

于 2013-04-01T10:00:23.450 回答