需求如下:
xxx公司(姑且表名就叫xxx)有许多项目 in (A,B,C),每个月1号会自动记录项目状态 in (x,y,z),现在要计算"目前有多少项目的最新状态为'x' "
表如下:
名称 | 更新时间 | 项目状态 | is_del |
A | 2019-04-01 | a | 0 |
B | 2019-04-01 | a | 0 |
C | 2019-04-01 | a | 0 |
A | 2019-05-01 | a | 0 |
B | 2019-05-01 | b | 0 |
C | 2019-05-01 | a | 0 |
A | 2019-06-01 | a | 0 |
B | 2019-06-01 | c | 0 |
C | 2019-06-01 | a | 0 |
A | 2019-07-01 | a | 0 |
B | 2019-07-01 | c | 0 |
C | 2019-07-01 | a | 0 |
A | 2019-08-01 | b | 1 |
B | 2019-08-01 | c | 0 |
C | 2019-08-01 | a | 0 |
SELECT sum((SELECT 项目状态
FROM xxx
WHERE 更新时间=(SELECT MAX(更新时间)
FROM xxx
WHERE is_del=0))='x') AS a
FROM xxx
最早的思路是这样的.大概就是sum一个表里的最新状态的数据里的x数量(这句有点拗口= =)
发现并不能这样算.而且子查询里算出来也不完全是我想要的,而且sum也不能这样用,即使真要这样用的话.同一个表也要在子查询里用代号分开才行
正确sql:
SELECT COUNT(项目状态) as num
FROM xxx a
WHERE 更新时间 IN(SELECT MAX(更新时间)
FROM xxx b
WHERE a.名称=b.名称
AND b.is_del = 0
AND a.项目状态 = 'a'
GROUP BY 名称 )
这样写就显得很清楚了,count的查询和子查询的表要分开,然后老老实实在where里写逻辑
结果:2
说明:B最后一个月已经不是状态'x'了,C最后一个月还是状态'x',A虽然不是状态'x',但是is_del=1,所以会取到前一个月的数据,为'x'