Рассчитать процент между двумя датами в MYSQL


Добрый день!

Я хотел бы рассчитать процент, сколько раз рейтинг появляется между двумя датами, рейтинги распространяются на "красный", "желтый" и "зеленый".

это таблица "questionario":

Tabela Questionario

Я попытался следующим образом:

$percentagem_verm=mysqli_query($link,"SELECT COUNT(q.pergunta_id) / t.total * 100 as perc, classificacao FROM questionario q,
( SELECT COUNT(*) AS total FROM questionario) t
WHERE q.classificacao = 'vermelho' AND data BETWEEN '".$_POST["datainicial"]."' AND '".$_POST["datafinal"]."'
 GROUP BY q.classificacao "));

даты я подобрал URL, и он работает правильно, но процент, который возвращает неправильный, это только правильно, когда я выбираю все данные из базы данных, но если с определенной даты все становится плохо...

Author: Diego Rafael Souza, 2018-06-27

3 answers

Попробуйте что-то более или менее

select ((count(if((classificacao = 'vermelho'), 1, 0)) / count(classificacao)) * 100) as perc
      ,classificacao
  from questionario
 where data BETWEEN '".$_POST["datainicial"]."' AND '".$_POST["datafinal"]."'
 group by classificacao

В Случае, если не уверен, что сверху попытайтесь без group by

select ((count(if((classificacao = 'vermelho'), 1, 0)) / count(classificacao)) * 100) as perc
  from questionario
 where data BETWEEN '".$_POST["datainicial"]."' AND '".$_POST["datafinal"]."'

РЕДАКТИРОВАТЬ

Извините, работу с firebird :D -

В mysql сделать так

select ((count(CASE WHEN classificacao like 'vermelho' THEN 1 END) / count(classificacao)) * 100) as perc
  from questionario
 where data BETWEEN '".$_POST["datainicial"]."' AND '".$_POST["datafinal"]."

Примечание. Только проверьте, если ставлю правильные имена,

 2
Author: Matheus Ribeiro, 2018-06-27 13:05:47

Процент будет определяться количеством элементов данной классификации, деленное на общее количество элементов все оценки, но слишком много фильтров - в вашем случае, по-видимому, являются только даты, должны быть одинаковыми на источник и суммы элементов по классификации.

То есть: TotalClassificacaoPeriodo / TotalPeriodo.

SELECT и был бы более или менее так:

SELECT q.classificacao, (COUNT(*) / t.Total) * 100 AS Percentual
FROM Questionario q,
  (SELECT COUNT(*) AS Total 
   FROM Questionario aux 
   WHERE aux.data >= '20180201' AND
         aux.data <= '20180228') t
WHERE q.data >= '20180201' AND
    q.data <= '20180228'
GROUP BY q.classificacao

* Я использовал подзапроса выборки в join, потому что Total будет уникальный применяться для всех regitros.
** Дата на фильтре в формате YYYYMMDD

Обратите Внимание, что фильтр даже в два запроса.

Вы можете проверить этот сценарий, который я создал в SQL Fiddle, чтобы продемонстрировать, эта логика работает

Я Надеюсь, что помог.

 3
Author: Diego Rafael Souza, 2018-06-27 13:00:52

Вы находитесь расчет общего 'SELECT count(*) as total from questionario" всегда с всех записей из таблицы на шаг, который вычисляет проценты, фильтрация дат с 'between'. Так что он правильный, вы должны рассчитать сумму, исходя из тех же условиях.

 0
Author: Lisângelo Berti, 2018-06-27 12:07:52