SQL 平均值与案例
SQL AVG with Case
我有一个数据库,它存储从 C 到 AAA 的值,而 C 是最差的,AAA 是最好的。
现在我需要这个值的平均值,但我不知道如何先将值转换为 int,计算平均值,将平均值四舍五入为 int,然后再转换回来。
定义:
C = 1
B = 2
A = 3
AA = 4
AAA = 5
甚至可以使用 SQL 语句吗?我试图将 AVG 和 CASE 结合起来,但我没有将它用于工作......
感谢您的帮助!
此致,
select avg(case score
when 'C' then 1
when 'B' then 2
when 'A' then 3
when 'AA' then 4
when 'AAA' then 5
end) as avg_score
from the_table;
(假设该列名为 score
)
要将其转换回 "character value",将输出换成另一种情况:
select case cast(avg_score as int)
when 1 then 'C'
when 2 then 'B'
when 3 then 'A'
when 4 then 'AA'
when 5 then 'AAA'
end as avg_score_value
from (
select avg(case score
when 'C' then 1
when 'B' then 2
when 'A' then 3
when 'AA' then 4
when 'AAA' then 5
end) as avg_score
from the_table;
) t
以上cast(avg_score as int)
假设ANSISQL。您的 DBMS 可能有不同的方法将值转换为整数。
我已经为您创建了这个示例。
你可以将你的排名转换为临时 table,然后计算,当你完成后,放弃它。
create table sof (id int identity,a nvarchar (10))
insert into sof values ('a')
insert into sof values ('b')
insert into sof values ('c')
select case a when 'AAA ' then 5
when 'AA' then 4
when 'A' then 3
when 'B' then 2
else 1
end as av
into #temp
from sof
----for rounded
select ROUND(AVG(CAST(av AS FLOAT)), 4)
from #temp
--not rounded
select AVG (av)
from #temp
我有一个数据库,它存储从 C 到 AAA 的值,而 C 是最差的,AAA 是最好的。
现在我需要这个值的平均值,但我不知道如何先将值转换为 int,计算平均值,将平均值四舍五入为 int,然后再转换回来。
定义:
C = 1
B = 2
A = 3
AA = 4
AAA = 5
甚至可以使用 SQL 语句吗?我试图将 AVG 和 CASE 结合起来,但我没有将它用于工作...... 感谢您的帮助!
此致,
select avg(case score
when 'C' then 1
when 'B' then 2
when 'A' then 3
when 'AA' then 4
when 'AAA' then 5
end) as avg_score
from the_table;
(假设该列名为 score
)
要将其转换回 "character value",将输出换成另一种情况:
select case cast(avg_score as int)
when 1 then 'C'
when 2 then 'B'
when 3 then 'A'
when 4 then 'AA'
when 5 then 'AAA'
end as avg_score_value
from (
select avg(case score
when 'C' then 1
when 'B' then 2
when 'A' then 3
when 'AA' then 4
when 'AAA' then 5
end) as avg_score
from the_table;
) t
以上cast(avg_score as int)
假设ANSISQL。您的 DBMS 可能有不同的方法将值转换为整数。
我已经为您创建了这个示例。 你可以将你的排名转换为临时 table,然后计算,当你完成后,放弃它。
create table sof (id int identity,a nvarchar (10))
insert into sof values ('a')
insert into sof values ('b')
insert into sof values ('c')
select case a when 'AAA ' then 5
when 'AA' then 4
when 'A' then 3
when 'B' then 2
else 1
end as av
into #temp
from sof
----for rounded
select ROUND(AVG(CAST(av AS FLOAT)), 4)
from #temp
--not rounded
select AVG (av)
from #temp