2015-12-01 8 views
0

У меня есть БД, которая хранит значение от C до AAA, а C - худшее, а AAA - лучшее.SQL AVG с футляром

Теперь мне нужно среднее значение этого значения, и я не знаю, как первыми преобразовать значения в int, вычислить среднее значение, округляя среднее значение до int и преобразовать его обратно.

Определения:

C = 1 
B = 2 
A = 3 
AA = 4 
AAA = 5 

Это даже возможно с помощью оператора SQL? Я пытался объединить AVG и CASE, но я не приношу его на работу ... Спасибо за вашу помощь!

Привет,

+3

Опубликовать то, что вы пробовали до сих пор. –

+1

Делайте одно за раз. Начните с преобразования букв в соответствующие номера. –

+0

Вы должны пометить свой вопрос в базе данных, которую используете. –

ответ

2
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)

Для того, чтобы преобразовать это обратно в "символьное значение", обернуть вывод в другом случае:

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) принимает ANSI SQL. В вашей СУБД могут быть разные способы присвоить значение целому числу.

+0

Большое спасибо! Это работает :-) Но Apache Derby вокруг значения - например, от 1,8 до 1 ... Но я думаю, что я нахожу решение (с круглым и плавающим) для этого ;-) – Contoweb

0

Я создал этот пример для u. u может привести ur ранжирование в таблицу temp, а затем вычислить и когда ур сделать, оставьте его.

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 
+0

Что такое «рейтинг ура»? –

+0

Я думал, что это колонка рейтинга. как AAA - лучший/худший. – DnL

+0

Так что это за «ур»? –