SQL COUNT和子查询

DPM*_*DPM 0 sql

编写以下查询时遇到问题:找到战斗的名称,其中至少3艘船的枪支数量低于9且其中至少有2艘在战斗中获得结果"ok".

在此输入图像描述

这是表的关系,我认为查询应该是这样的:

 select o.BATTLE 
 from OUTCOMES o 
 join SHIPS s on o.SHIP = s.NAME
 join CLASSES c on s.CLASS = c.CLASS
 group by o.BATTLE
 having COUNT(case when 
            -- condition for ar least 3 ships with NUMGUNS < 9 and at least 2 of them with result = 'ok'
            then 1 else null end);
Run Code Online (Sandbox Code Playgroud)

我是一个相对较新的SQL,这对我来说不容易查询.提前致谢.

PS我使用MSSQL.

Jua*_*eza 5

select o.BATTLE 
from OUTCOMES o 
join SHIPS s on o.SHIP = s.NAME
join CLASSES c on s.CLASS = c.CLASS
group by o.BATTLE    
having 
      COUNT(CASE WHEN c.NUMGUNS < 9 THEN 1 END) >= 3
  AND COUNT(CASE WHEN o.RESULT = 'OK' THEN 1 END) >= 2
Run Code Online (Sandbox Code Playgroud)

您可以添加ELSE NULLreadbilty,但是NULL是默认值CASE.

因为你的问题不清楚,你也可以考虑这一点

having 
      COUNT(CASE WHEN  c.NUMGUNS < 9 THEN 1 END) >= 3
  AND COUNT(CASE WHEN (c.NUMGUNS < 9 AND o.RESULT = 'OK') THEN 1 END) >= 2
Run Code Online (Sandbox Code Playgroud)

编辑由shawnt00建议

select o.BATTLE 
from OUTCOMES o 
join SHIPS s on o.SHIP = s.NAME
join CLASSES c on s.CLASS = c.CLASS
WHERE c.NUMGUNS < 9
group by o.BATTLE    
having 
      COUNT(*) >= 3
  AND COUNT(CASE WHEN o.RESULT = 'OK' THEN 1 END) >= 2
Run Code Online (Sandbox Code Playgroud)

  • 当然对于第二种情况,`<9`条件可以被推入`where`子句,导致`count(*)> = 3`. (2认同)