3

スキーマを含む 2 つのテーブルを次に示します。

船(名前、発売年、国、銃の数、銃のサイズ、排気量)
戦闘(船、戦闘名、結果)

典型的な Ships タプルは次のようになります:

(「ニュージャージー」、1943、「アメリカ」、9、16、46000)

これは、戦艦ニュージャージーが 1943 年に進水したことを意味します。それは米国に属し、サイズ 16 インチ (ボア、またはバレルの内径) の 9 門の銃を搭載し、重量 (航海用語で変位) 46,000 トンでした。

バトルの典型的なタプルは次のとおりです。

(「フッド」、「北大西洋」、「沈没」)

つまり、HMSフッドは北大西洋の戦いで沈没しました。他に考えられる結果は、'ok' と 'damaged' です。

スリガオ海峡の海戦では 、その戦闘に参加した (1 隻以上の戦艦が参加した) 国ごとに、沈められた戦艦の数を答えてください。注: この質問は非常にトリッキーです。特に、ある国が戦闘に参加したが、船を沈めなかった (歴史的な) ケースに対処する必要があります。

これまでに試したこと。

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

その戦闘に参加した国 (1 隻以上の戦艦が参加していた)

これは、battleName が「Surigao Strait」である戦闘で少なくとも 1 つのレコードがあることを意味します。を意味しINNER JOINます。

沈没した戦艦の数を教えてください

これは条件付きカウントであり、ここに「トリック」があります。条件 end を指定して 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

サンプル船の記録

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 に答える
1

テーブルに参加する必要があり、との関係は other によるものだと思い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 に答える