首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于计数的复杂SQL查询

关于计数的复杂SQL查询
EN

Stack Overflow用户
提问于 2012-09-11 06:32:31
回答 3查看 4.3K关注 0票数 3

下面是两个带有模式的表:

船舶(名称、yearLaunched、国家、numGuns、gunSize、排水量) 战斗(船,battleName,结果)

典型的船舶元组是:

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

这意味着新泽西号战舰是1943年发射的;它属于美国,携带9支16英寸口径(内径或内径的枪管)枪支,重量46,000吨。

一个典型的战斗元组是:

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

也就是说,HM.S.胡德号在北大西洋战役中沉没了。其他可能的结果是“ok”和“损坏”。

下面是一个棘手的问题:对于每一个参与这场战斗的国家(有一艘或多艘战舰参与),为Surigao海峡的战斗提供了沉没的战舰数量。注意:这个问题非常棘手。特别是,你需要处理的(历史)案例,一个国家参与战斗,但没有任何船只沉没。

到目前为止我尝试过的。

代码语言:javascript
运行
复制
SELECT country,COUNT(name) 
FROM ships RIGHT JOIN battles 
      ON ships.name=battles.ship 
WHERE battleName='Battle1' AND result='sunk' 
GROUP BY country
EN

回答 3

Stack Overflow用户

发布于 2012-09-11 07:19:10

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

这意味着在battleName海峡的战斗中至少有过一次记录。意思是一个INNER JOIN

给出它沉没的战舰数量。

这是一个有条件的计数,这里是“技巧”。你可以用一个条件结束的和,然后你可以让计数船沉没。

代码语言:javascript
运行
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-09-11 06:36:53

您需要加入这些表,我猜与之的关系是通过name of the ship实现的。试试这个,

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-09-11 07:21:49

样本船记录

代码语言:javascript
运行
复制
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

样本作战记录

代码语言:javascript
运行
复制
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

这就是你要找的吗?

代码语言:javascript
运行
复制
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

结果

国家

代码语言:javascript
运行
复制
Urugaya 1
USA 2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12363962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档