有关COUNT的棘手的SQL查询

时间:2012-09-11 06:32:32

标签: mysql sql

以下是两个包含架构的表:

  

船舶(名称,年份,国家,号码,枪支,位移)
  战斗(船,战斗名称,结果)

典型的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

3 个答案:

答案 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