2015-12-03 1 views
1

Предположим, что в таблице указано class_nr, а значения выборки class_nr - это E, U, R, O, P, S.SQL Server: назначить значение для символа и получить среднее значение для каждого пользователя

+---------+-------------+ 
| user_id | class_nr | 
+---------+-------------+ 
| 1  | E   | 
| 1  | O   | 
| 1  | E   | 
| 2  | P   | 
| 2  | R   | 
| 2  | U   | 
+---------+-------------+ 

Очки для класса:

E=5 
U=4 
R=3 
O=2 
P=1 

Теперь я хочу, чтобы вычислить средние баллы для пользователя для class_nr у него есть. Например, user_id 1 имеет 2 E с и 1 O. Таким образом, он имеет средние точки:

(5+2+5)/3 = 4 

user_id Аналогично 2 получает:

(1+3+4)/3 = 2.67 

Как я могу добиться этого с одного запроса SQL в SQL Server?

+1

Я создайте таблицу справки Points_for_class, присоединитесь к ней, выполните групповую настройку с помощью AVG и т. д. (или CASE, если нет дополнительной таблицы.) – jarlh

+0

К сожалению, у меня нет возможности создавать или изменять таблицы в БД. Я могу просто получить данные. –

ответ

4

Делают GROUP BY, используйте выражение CASE дать каждому class_nr это правильное числовое значение:

select user_id, SUM(case class_nr when 'E' then 5.0 
            when 'U' then 4.0 
            when 'R' then 3.0 
            when 'O' then 2.0 
            when 'P' then 1.0 end)/count(*) 
from tablename 
group by user_id 
+0

Отлично! Благодаря :) –

0

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

CREATE TABLE #temp (
    user_id INT 
    ,class_nr CHAR(1) 
    ) 

    INSERT INTO #temp 
    VALUES (
    1 
    ,'E' 
    ) 
    ,(
    1 
    ,'O' 
    ) 
    ,(
    1 
    ,'E' 
    ) 
    ,(
    2 
    ,'P' 
    ) 
    ,(
    2 
    ,'R' 
    ) 
    ,(
    2 
    ,'U' 
    ) 



    select user_id,avg(case when class_nr = 'E' then 5.0 
    when class_nr = 'O' then 2.0 
    when class_nr = 'P' then 1.0 
    when class_nr = 'R' then 3.0 
    when class_nr = 'u' then 4.0 

    end) from #temp group by user_id 
Смежные вопросы