3

这是两个带有架构的表:

舰船(名称、发射年份、国家、数量、枪号、位移)
战斗(舰船、战斗名称、结果)

一个典型的 Ships 元组是:

(“新泽西”,1943,“美国”,9、16、46000)

这意味着新泽西号战列舰于1943年下水;它属于美国,携带 9 门 16 英寸(口径或枪管内径)的火炮,重 46,000 吨。

Battles 的典型元组是:

(“胡德”、“北大西洋”、“沉没”)

也就是说,HMS Hood 在北大西洋海战中沉没。其他可能的结果是“正常”和“损坏”。

这里有一个棘手的问题: 对于苏里高海峡海战,对于参与那场战斗的每个国家(有一艘或多艘战列舰参加),请给出其被击沉的战列舰数量。注意:这个问题非常棘手。特别是,您需要处理一个国家参与战斗但没有任何船只沉没的(历史)案例。

到目前为止我所尝试的。

SELECT country,COUNT(name) 
FROM ships RIGHT JOIN battles 
      ON ships.name=battles.ship 
WHERE battleName='Battle1' AND result='sunk' 
GROUP BY country
4

3 回答 3

4

参与那场战斗的国家(有一艘或多艘战列舰参加)

意思是在战名为“苏里高海峡”的战斗中至少有一项记录。这意味着一个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
于 2012-09-11T07:19:10.140 回答
1

您需要加入表格,我猜与 is other 的关系是 by 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
于 2012-09-11T06:36:53.413 回答
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

结果

国家/地区

Urugaya 1
USA 2
于 2012-09-11T07:21:49.447 回答