MySql опрос отдельный запрос

Эй, ребята, я действительно борюсь с 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

3

Решение

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

Скрипка для версии выше

Не очень элегантно, но работает

2

Другие решения

Мне не нравится сама эта идея, но если вам нужно, вы можете:

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
1

По вопросам рекламы [email protected]