Показать результат формулы, применяемый более чем к одному столбцу - PullRequest
0 голосов
/ 19 июня 2020

Я использую Microsoft SQL Server 2017.

Я получаю эти результаты на SQL сервере, применяя простое предложение SELECT:

SELECT Result, Year, Month FROM Table;

Result      Year    Month
DELAY       2019    5
DELAY       2019    1
PUNCTUAL    2020    2
PUNCTUAL    2020    2
PUNCTUAL    2020    3
PUNCTUAL    2020    3
PUNCTUAL    2020    3
PUNCTUAL    2020    3
DELAY       2020    3
PUNCTUAL    2020    3

Мне нужно получить процент ПУНКТУАЛЬНЫХ результатов, разделенных столбцами месяца и года. Формула представляет собой сумму общих результатов, разделенных по месяцам и годам, деленную на ПУНКТУАЛЬНЫЕ результаты, умноженные на * 100.

Например, в марте 2020 года будет: 5 пунктуальных / 6 результатов * 100 = 83,3% пунктуальных. полученные результаты; остальные - задержки, которые меня не интересуют.

Я пробовал использовать COUNT CASE WHEN, но не смог заставить его работать должным образом.

Например, результат, который мне нужен get будет выглядеть так:

Year       Month       Success
2019       1           0%
2019       5           0%
2020       2           100%
2020       3           83.3%

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Мне нравится использовать AVG() для этого:

select year, month,
       avg(case when result = 'PUNCTUAL' then 1.0 else 0 end) as punctual_rate
from t
group by year, month
order by year, month;

Если вам нужно число от 0 до 100, просто используйте 100.0 вместо 1.0.

1 голос
/ 19 июня 2020

Вы можете использовать следующий оператор для вычисления процента, используя COUNT() и CASE:

SELECT 
   Year,
   Month,
   COUNT(CASE WHEN Result = 'PUNCTUAL' THEN 1 END) * 100.0 / COUNT(*) As Success
FROM (VALUES
   ('DELAY',    2019, 5),
   ('DELAY',    2019, 1),
   ('PUNCTUAL', 2020, 2),
   ('PUNCTUAL', 2020, 2),
   ('PUNCTUAL', 2020, 3),
   ('PUNCTUAL', 2020, 3),
   ('PUNCTUAL', 2020, 3),
   ('PUNCTUAL', 2020, 3),
   ('DELAY',    2020, 3),
   ('PUNCTUAL', 2020, 3)
) v (Result, Year, Month)
GROUP BY Year, Month
ORDER BY Year, Month

Результат:

Year    Month   Success
2019    1       0.000000000000
2019    5       0.000000000000
2020    2       100.000000000000
2020    3       83.333333333333

Если вам нужно получить процент как текст, вы можете использовать CONCAT():

CONCAT(
   CONVERT(numeric(10, 2), COUNT(CASE WHEN Result = 'PUNCTUAL' THEN 1 END) * 100.0 / COUNT(*)), 
   '%') AS SuccessFormatted
0 голосов
/ 19 июня 2020

Вы можете использовать агрегацию с командой FORMAT, чтобы получить желаемый результат:

CREATE TABLE #T1(Result varchar(10),Year int, Month int)
INSERT INTO #T1 VALUES('DELAY', 2019, 5),
('DELAY',2019,1),
('PUNCTUAL',2020,2),
('PUNCTUAL',2020,2),
('PUNCTUAL',2020,3),
('PUNCTUAL',2020,3),
('PUNCTUAL',2020,3),
('PUNCTUAL',2020,3),
('DELAY',2020,3),
('PUNCTUAL',2020,3)




SELECT [Year], [Month], FORMAT( (((PuncCnt * 1.0) / Total)) ,'P2') Success
FROM
    (
    SELECT [Year],[Month], SUM(CASE WHEN Result = 'PUNCTUAL' THEN 1 ELSE 0 END) PuncCnt, COUNT(*) Total
    FROM #t1
    GROUP BY [Year],[Month]
    ) T2
ORDER BY [Year],[Month]

РЕЗУЛЬТАТ:

Year    Month   Success
2019    1        0.00%
2019    5        0.00%
2020    2       100.00%
2020    3        83.33%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...