Расчет процента различных категорий, которые удовлетворяют условиям с SQL Server - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть таблица с информацией о рейсах между городами, которая выглядит следующим образом:

    origin_city dest_city   time    
    Dothan AL   Atlanta GA    171    
    Dothan AL   Atlanta GA    171    
    Dothan AL   Elsewhere AL    2    
    Dothan AL   Elsewhere AL    2    
    Dothan AL   Elsewhere AL    2    
    Boston MA   New York NY     5    
    Boston MA   City MA         1    
    New York NY Boston MA       5    
    New York NY Boston MA       5    
    New York NY Boston MA       5    
    New York NY Poughkipsie NY  2

Я хочу найти для каждого исходного города процент рейсов, продолжительность которых менее 3 часов.Таким образом, результаты будут такими:

    Dothan AL    60
    Boston MA    50
    New York NY  25

Код, который я думал, будет работать, выглядит следующим образом:

     SELECT F.origin_city as origin_city,    
       ((SELECT COUNT(*) FROM Flights as F2
       WHERE F2.actual_time < 3) / (SELECT COUNT(*) FROM Flights as  F3)) * 100
     AS percentage
     FROM Flights as F
     GROUP BY F.origin_city
     ORDER BY percentage;
     GO

Когда я запускаю его, я получаю список городов происхождения истолбец для процента, как и ожидалось, но процент всегда равен 0. Я все еще довольно озадачен подзапросами (как вы можете видеть).

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я бы сделал это, используя AVG() в качестве оконной функции:

SELECT F.origin_city as origin_city, 
       AVG( CASE WHEN F2.actual_time < 3 THEN 100.0 ELSE 0 END) as percentage
FROM Flights F
GROUP BY F.origin_city
ORDER BY percentage;

Предполагается, что время измеряется в часах.Согласно Google Maps, вы можете дойти от Дотана до Атланты за 68 часов, поэтому 171 подозрительно.

0 голосов
/ 04 февраля 2019

Ваш процент по всей таблице, а не по группам по городам происхождения.Попробуйте что-то вроде этого:

 SELECT F.origin_city as origin_city,    
   (SUM(CASE WHEN F.actual_time < 3 THEN 1 ELSE 0 END) / COUNT(*) )  * 100 AS percentage
 FROM Flights as F
 GROUP BY F.origin_city
 ORDER BY percentage;
 GO

FWIW проблема с вашим текущим подзапросом заключается в том, что у вас нет соединения между текущей строкой и данными в подзапросе.Вы, вероятно, могли бы переписать его как-то так:

 SELECT F.origin_city as origin_city,    
 ((SELECT COUNT(*) FROM Flights as F2
 WHERE F2.origin_city = F.origin_city and F2.actual_time < 3) / (SELECT COUNT(*) FROM Flights as  F3 where F3.origin_city = F.origin_city)) * 100
 AS percentage
 FROM Flights as F
 GROUP BY F.origin_city
 ORDER BY percentage;
 GO

Но нет необходимости повторять запрос к таблице для каждой строки, когда у вас уже достаточно данных для выполнения расчетов, как показано выше.

...