Эй, ребята, я действительно борюсь с MySql
запрос, у меня есть таблица с именем «информация» и в нем у меня есть столбец с именем «рейтинг» в нем у меня есть рейтинги между 1-10.
Теперь мне нужно сгенерировать процентное значение количества оценок от 1-6 до 7-8 и 9-10, но мне нужно, чтобы они отчаянно отображались, и после этого мне нужен второй запрос, который может вычесть процентное значение результатов из 1-6 и 9-10.
Приведенный ниже запрос является настолько близким, насколько я мог получить из всех моих исследований, однако я не знаю, как получить процент оценок только 1-6, а не все из них, а также как получить второй запрос, чтобы вычесть 1-6 и 9-10 рейтинговых процентов.
SELECT rating,
COUNT(*) AS Count,
(COUNT(*) / _total ) * 100 AS Percentege
FROM info,
(SELECT COUNT(*) AS _total FROM info) AS myTotal
GROUP BY rating
select if(rating between 1 and 6, '1-6',
if( rating between 7 and 8, '7-8',
'9-10' )
) as rating_range,
count(1) as num
from info
group by rating_range
Изменить: Добавление округления и расчетов
Это может быть использовано как подзапрос. Учитывая группу, вам нужно получить общую сумму отдельно:
select Q.rating_range,
Q.num,
round(Q.num * 100 / Q.total, 2) as percent
from (
select R.*,
(select count(1) from info) as total
from (
select if(rating between 1 and 6, '1-6',
if( rating between 7 and 8, '7-8',
'9-10' )
) as rating_range,
count(1) as num
from info
group by rating_range ) R
) Q
group by Q.rating_range
Что касается относительных значений, я бы, вероятно, сделал бы это в своем внешнем приложении, если бы оно было. В противном случае вы могли бы сделать конкретный запрос, я полагаю:
select Q.rating_range,
Q.num,
round(Q.num * 100 / Q.total, 2) as percent,
round( (Q.num - Q.total_nine_ten) * 100 / Q.total, 2) as diff_from_nine_ten
from (
select R.*,
(select count(1) from info) as total,
(select count(1) from info where rating > 8 ) as total_nine_ten
from (
select if(rating between 1 and 6, '1-6',
if( rating between 7 and 8, '7-8',
'9-10' )
) as rating_range,
count(1) as num
from info
group by rating_range ) R
) Q
group by Q.rating_range
Не очень элегантно, но работает
Мне не нравится сама эта идея, но если вам нужно, вы можете:
http://sqlfiddle.com/#!9/bd1c5/1
SELECT rating,
COUNT(*) AS Count,
(COUNT(*) / COALESCE ((SELECT COUNT(*) AS _total FROM info),1) ) * 100 AS Percentege
FROM info
GROUP BY rating
или если мы уверены, что таблица не пуста:
SELECT rating,
COUNT(*) AS Count,
(COUNT(*) / (SELECT COUNT(*) FROM info) ) * 100 AS Percentege
FROM info
GROUP BY rating
ОБНОВИТЬ Еще более странный, но запрошенный результат:
http://sqlfiddle.com/#!9/4b6bf/4
SELECT
IF(rating>=0 AND rating<=6, '1-6',
IF(rating<=8,'7-8',
IF(rating<=10,'9-10','UNKNOWN')
)
) as pseudo_rating,
COUNT(*) AS Count,
(COUNT(*) / (SELECT COUNT(*) FROM info) ) * 100 AS Percentege
FROM info
GROUP BY pseudo_rating
ОБНОВИТЬ КРУГЛЫЙ()
http://sqlfiddle.com/#!9/4b6bf/6
SELECT
IF(rating>=0 AND rating<=6, '1-6',
IF(rating<=8,'7-8',
IF(rating<=10,'9-10','UNKNOWN')
)
) as pseudo_rating,
COUNT(*) AS Count,
ROUND((COUNT(*) / (SELECT COUNT(*) FROM info) ) * 100, 2) AS Percentege
FROM info
GROUP BY pseudo_rating