显示应用于多个列的公式结果

4zcjmb1e  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(245)

我使用的是microsoft sql server 2017。
我在sql server上应用一个简单的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年3月:5个准时/6个结果*100=83.3%准时结果;其他的是延迟,我对此不感兴趣。
我试过计数的情况下,但我不能得到它正常工作。
例如,我需要得到的结果是:

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

谢谢你的帮助。

8fsztsew

8fsztsew1#

我喜欢用 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 .

qni6mghb

qni6mghb2#

您可以使用以下语句使用 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
clj7thdc

clj7thdc3#

您可以将聚合与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%

相关问题