2013-06-27 4 views
0

Похоже, мой вопрос не достаточно ясно, поэтому я стараюсь, чтобы переписать его:SQL (Sqlite) GROUP BY и COUNT

У меня есть «файл» таблицы в том числе среди других полей «альбом» и «рейтинг». Каждый альбом имеет заданное количество записей в таблице файлов, каждый из которых имеет рейтинг. Оцененные файлы имеют рейтинг> 0.

Я хочу получить средний рейтинг для каждого альбома (это можно сделать с помощью запроса ниже). НО, я только хочу, чтобы включить альбомы, которые по крайней мере, определенный процент (75%, например) его файл рейтинг (рейтинг> 0)

select album, avg(rating) AS avgRating 
from file 
group by album 
order by avgRating DESC 

Может кто-то помочь в добавлении недостающего положения.

+0

Что вы имеете в виду% файлов? –

+0

Я имею в виду (COUNT (*) FROM file ГДЕ рейтинг> 0 GROUP BY album/COUNT (*) FROM файл GROUP BY album) * 100 – phramusca

ответ

1

(Обновлено, следующие комментарии):

select album, avg(rating) AS avgRating 
from file 
group by album 
having sum(case when rating > 0 then 1 end)*1.0/count(*) > 0.5 
order by avgRating DESC 
+0

Это тоже хорошо. Однако, если я изменил «> = 0,75» на «> 0,5», чтобы сравнить с результатами запроса kcsoft, ваш запрос возвращает меньше записей ... dunno why yet – phramusca

+0

@RaphaelCamus: Если вы измените «> = 0,75» на «> = 0,5" , вы получаете такое же количество результатов, как и kcsoft? Если вы измените 'count (*)/2' в своем запросе на' count (*)/2.0', вы получите те же результаты, что и этот запрос с «> 0,5»? (Я подозреваю, что 'count (*)/2' оценивается как целое число.) –

+0

его запрос возвращает 202 записи с обоими случаями, которые вы упомянули, а ваш возвращает 114 в обоих случаях. – phramusca

1

Если вы имеете в виду средний рейтинг нужно HAVING avg(rating) > 0

+0

Нет, я не имею в виду средний рейтинг, это легко :) Что мне нужно, так это список только альбомов, имеющих x% его файлов с рейтингом> 0 (зная, что каждый альбом имеет заданное количество записей в таблице «файл», поэтому я группирую по «альбому») – phramusca

1

Попробуйте

select album, avg(rating) AS avgRating from file group by album having avg(rating)>0 order by avgRating DESC 

или

select album, avg(rating) AS avgRating from file group by album where rating>0 order by avgRating DESC 
+0

Это не устраивает моих потребностей. Первый возвращает только альбомы со средним значением> 0, а второй делает среднее значение только по рейтингу файлам ... – phramusca

+0

Вы хотите, чтобы средний рейтинг каждого альбома, если рейтинг> 0 был правильным? –

+0

Aie, я даже не могу объяснить свои потребности на английском :( – phramusca

1
select 
    album, 
    (case when sum(rating>0)>(count(*)/2) then avg(rating) else -1 end) AS avgRating 
from file 
group by album 
having avgRating >= 0 
order by avgRating DESC 

COUNT (*)/2 < - ваш процент 50% в моем примере.

+0

Вы пробовали это? Это вернет только альбомы и средние оценки их файлов, которые имеют (рейтинг> 0) – kcsoft

+0

звучит здорово! Только из-за наличия предложения по какой-то причине – phramusca

+0

извините, я переместил его перед порядком заказа – kcsoft