2015-12-01 93 views
0

我有一個DB存儲從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。您的DBMS可能有不同的方法將值轉換爲整數。

+0

非常感謝!它的工作原理是:-) 但是Apache Derby圍繞着這個值 - 例如 - 1.8到1 ...但是我想我找到了一個解決方案(用round和float);-) – Contoweb

0

我已經爲你創建了這個例子。 你可以將你的排名轉換成臨時表,然後計算,當你完成時,放棄它。

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

什麼是「ur排名」? –

+0

我認爲這是一個排名專欄。 像AAA是最好的/更糟的。 – DnL

+0

那麼,「你」是什麼? –