2015-10-09 2 views
3

Эй, ребята, я действительно борюсь с запросом MySql, у меня есть таблица с именем «информация», и в ней у меня есть столбец под названием «рейтинг». У меня есть оценки от 1 до 10.MySql опрос различных запросов

Теперь мне нужно создать процентное значение количества оценок от 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 
+0

Я хотел бы сделать простой GROUP BY рейтинг запроса и обработать полученный массив в PHP, чтобы получить процентные ставки по рейтингам, которые мне нужны. – viktor77

+0

Что такое '_total'? –

+0

Не уверен, как объяснить, но группа по функциям не уверена, что это сработает. –

ответ

2
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 

Working fiddle

Редактирование: добавление округления и вычислений Это может использоваться как подзапрос. Учитывая группу, вам нужно, чтобы получить общее количество отдельно:

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 

Fiddle for version above

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

+0

Да, это почти что мне просто нужно, чтобы процентное значение округлилось, еще один вопрос, как бы я мог вычесть процентное значение рейтинга 1-6 с 9-10? –

+0

Спасибо, человек, это все, что мне нужно ... –

+0

Нужно спросить, что мой Dreamweaver дает ошибку, говоря, что синтаксис неверен из строки 2, когда я добавляю набор записей, но он отлично работает в phpmyadmin. –

1

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

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 

UPDATE Еще более странный, но запрашиваемый результат:

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 

ОБНОВЛЕНИЕROUND()

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 
+0

Таблица будет выглядеть следующим образом: -------------------- | Рейтинг | | ------------------- | | | 10 | | 8 | | 10 | | 8 | | 9 | | 2 | | 2 | | 4 | | 4 | | 8 | -------------------- Желаемый результат будет оценен 9-10 = 30% –

+0

Извините, что я новичок в этом ... –

+0

@ DanielSmit вы попробовали мой запрос? вы посетили мой sqlfiddle? – Alex

Смежные вопросы