以下是两个包含架构的表:
船舶(名称,年份,国家,号码,枪支,位移)
战斗(船,战斗名称,结果)
典型的Ships元组将是:
('New Jersey',1943,'USA',9,16,46000)
这意味着战舰新泽西州于1943年发射;它属于美国,装有9门16英寸(枪管或枪管内径)的枪,加重(以航空方式移位)46,000吨。
战斗的典型元组是:
('胡德','北大西洋','沉没')
即H.M.S.胡德在北大西洋的战斗中沉没。其他可能的结果是“确定”和“损坏”。
这是棘手的问题: 对于苏里高海峡的战斗,对于参与该战斗的每个国家(参与一艘或多艘战列舰),请提供其沉没的战舰数量。注意:这个问题非常棘手。特别是,你需要处理一个国家参与战斗但没有沉没任何船只的(历史)案例。
到目前为止我尝试过的。
SELECT country,COUNT(name)
FROM ships RIGHT JOIN battles
ON ships.name=battles.ship
WHERE battleName='Battle1' AND result='sunk'
GROUP BY country
答案 0 :(得分:3)
参与那场战斗的国家(有一艘或多艘战列舰 参与)
这意味着在battleName为'Surigao Strait'的战斗中至少有一条记录。这意味着INNER JOIN
。
给出沉没战舰的数量
这是一个条件计数,这是“技巧”。您可以使用条件结束的SUM,然后可以将沉没的船只计数。
SELECT country,SUM(CASE WHEN result = 'sunk' THEN 1 ELSE 0 END) AS TotalShipSunk
FROM ships
INNER JOIN battles
ON ships.name=battles.ship
WHERE battleName='Surigao Strait'
GROUP BY country
答案 1 :(得分:1)
您需要加入表格,我猜其他人的关系是name of the ship
。试试这个,
SELECT a.country,
SUM(CASE WHEN b.result = 'SUNK' THEN 1 ELSE 0 END) totalSunkShips,
SUM(CASE WHEN b.result = 'OK' THEN 1 ELSE 0 END) totalUNSunkShips
FROM battles a
INNER JOIN ships b
ON a.ship = b.name
WHERE b.battleName = 'Surigao Strait'
GROUP BY a.country
答案 2 :(得分:1)
样品发货记录
name yearLaunched country numGuns gunSize displacement
New Jersey 1943 USA 9 16 46000
Surigao Strait Battle ship USA 1800 USA 9 16 5000
Surigao Strait Battle ship USA 1800 USA 9 16 5000
Surigao Strait Battle ship UK 1800 UK 7 16 27000
Surigao Strait Battle ship France 1800 France 9 16 5000
Surigao Strait Battle ship Urugaya 1800 Urugaya 7 16 27000
New Jersey 1943 UK 9 16 46000
示例战斗记录
ship battleName result
Hood North Atlantic sunk
Surigao Strait Battle ship USA Surigao Strait sunk
Surigao Strait Battle ship UK Surigao Strait damaged
Surigao Strait Battle ship France Surigao Strait ok
Surigao Strait Battle ship Urugaya Surigao Strait sunk
这就是你要找的东西
SELECT s.country,Count(s.name) AS Cnt
FROM ships s
JOIN (SELECT *
FROM Battles
WHERE battleName='Surigao Strait' AND result='sunk' )b
ON s.name=b.ship
GROUP BY s.country
<强>结果强>
country Cnt
Urugaya 1
USA 2