编写以下查询时遇到问题:找到战斗的名称,其中至少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.
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)