2014-09-09 2 views
1

У меня есть таблица рейтинги:Найти среднее поле нескольких строк

part  rating  numReviews 
----  ------  ---------- 
A1  100  5 
A1  50   2 
A2  90   4 
A3  100  4 

Мне нужно найти средний рейтинг для каждой части. В приведенном выше примере A2 составляет 90, а A3 - 100, поскольку они являются одиночными линиями. Легко.

Однако часть A1 является несколько строк, поэтому мне нужно сделать рейтинг * numReviews для каждой строки затем разделить по общего numReviews

Возможно ли это? Это то, что я пытаюсь (Microsoft SQL):

select part, 
cast((AVG((rating * numReviews)/SUM(numReviews))) as decimal(5,2)) as rating_average 
from tableName group by part order by part 

Я получаю следующее сообщение об ошибке:

Cannot perform an aggregate function on an expression containing an aggregate or a subquery. 

ответ

1
Select part, Sum(rating) as ratings,Sum(numReviews) as TotalReviews, 
     (Sum(rating) /sum(numReview)) as rating_average 
From tableName 
Group By part 
2

Если магазин рейтинг столбца значение индивидуальных рейтингов (то есть у вас есть 4 рейтинги со значением 100 с общим объемом 400 для A3 и вы хотите знать среднее значение рейтингов (рассчитано как total per group/(rating value * rating count)), а выход должен быть:

part AverageRating 
---- --------------------------------------- 
A1 85.71428571428571428571428571 
A2 90.00000000000000000000000000 
A3 100.00000000000000000000000000 

Тогда этот запрос будет сделать это:

select 
    part, 
    sum(rating * numreviews)/sum(cast(numreviews as decimal(5,2))) as AverageRating 
from tableName 
group by part 

Если с другой стороны, колонка рейтинга хранит совокупность оценок (что означает значение 100 для A3 должно быть истолковано как 4 * 25), и вы хотите, средний рейтинг в группе с этим выходом:

part rating_average 
---- --------------------------------------- 
A1 21.4285714285714285714 
A2 22.5000000000000000000 
A3 25.0000000000000000000 

Тогда это:

with ratings as (select 
    part, 
    sum(rating) r, 
    sum(numreviews) as c 
from TableName 
group by part 
) 
select part, avg(r/cast(c as decimal)) AS rating_average 
from ratings 
group by part 

Я думаю, что это бывший вы ищете, не последний.

0

Или вы могли бы сделать это шаг за шагом ради ясности

SELECT Level1.*,(Level1.ratings/Level1.TotalReviews) as rating_average 
FROM 
    (
    Select part, Sum(rating) as ratings,Sum(numReviews) as TotalReviews 
    From tableName 
     GroupBy part 
    ) as Level1 
1

Вы можете просто использовать SUM:

SELECT part, 
    CAST(SUM(rating * numReviews)/SUM(numReviews) AS DECIMAL(5, 2)) as rating_average 
FROM tableName 
GROUP BY part 
ORDER BY part 
Смежные вопросы