SQL-EX.ru查询问题集#32

Adr*_*Fox 5 sql t-sql

我正在尝试编写SQL查询来解决www.sql-ex.ru(问题32)上的问题,我得到了正确的结果,但是该网站将我的查询验证为不受欢迎的解决方案。(可能出于各种原因:逻辑错误或效率低下等)

模式

http://www.sql-ex.ru/images/ships.gif

SQL查询问题:

船舶的特征之一是其主炮(mw)口径的一半。在2个小数位内,定义数据库中有船的每个国家/地区的船的mw平均值。

网站上的数据注释

正在考虑参加第二次世界大战的海军舰船数据库。该数据库具有以下关系:类(类,类型,国家/地区,数量,孔,位移)船(名称,类,发射的)战役(名称,日期)结果(船,战役,结果)单个项目。通常为一个船级分配所考虑的船级中的第一艘船的名称(总船);否则,类名与数据库中的任何船名都不匹配。“类别”关系包括类别名称,类型(战舰为bb,战舰为bc),战舰制造国家/地区,主炮数量,枪口径(枪管直径,以英寸为单位)和排量(以吨为单位的重量)。船舶关系包括船舶名称,类别名称和发射年份。战役关系涵盖了舰只参加战斗的名称和日期;而他们参与战斗的结果(沉没,损坏或未受伤害-可以)与结果相关。注意:1)结果关系可能包括未包含在“船舶”关系中的船舶。2)沉船无法参加战斗。

我的查询

            SELECT c.country, CAST( AVG(0.5*POWER(c.bore,3.0) ) AS DECIMAL(10,2) )
            AS  weight FROM
    (
    SELECT ship FROM Outcomes
    INTERSECT
    SELECT class FROM Classes
    EXCEPT
    SELECT class FROM Ships
    UNION ALL
    SELECT class FROM Ships

    ) AS cte1

    LEFT OUTER JOIN Classes AS c
    ON cte1.ship=c.class
    GROUP BY country
Run Code Online (Sandbox Code Playgroud)

正确结果

国家重量

德国1687.50

英国山1687.50

美国1897.78

我的问题: 鉴于查询会产生正确的结果,我的查询不正确吗?非常感谢。

小智 0

SELECT COUNTRY, CONVERT(NUMERIC(10,2),AVG(BORE*BORE*BORE/2)) WEIGHT 
FROM (SELECT COUNTRY,BORE,NAME
    FROM CLASSES 
    RIGHT JOIN SHIPS ON SHIPS.CLASS = CLASSES.CLASS
    UNION
    SELECT DISTINCT COUNTRY, BORE, SHIP
    FROM CLASSES C 
    LEFT JOIN OUTCOMES O ON O.SHIP = C.CLASS 
    WHERE  NOT EXISTS(SELECT NAME 
    FROM SHIPS 
    WHERE NAME = O.SHIP) AND 
    NOT (SHIP IS NULL)
 )T
GROUP BY COUNTRY
Run Code Online (Sandbox Code Playgroud)