Рассчитать процент между двумя датами в MYSQL
Добрый день!
Я хотел бы рассчитать процент, сколько раз рейтинг появляется между двумя датами, рейтинги распространяются на "красный", "желтый" и "зеленый".
это таблица "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, и он работает правильно, но процент, который возвращает неправильный, это только правильно, когда я выбираю все данные из базы данных, но если с определенной даты все становится плохо...
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"]."
Примечание. Только проверьте, если ставлю правильные имена,
Процент будет определяться количеством элементов данной классификации, деленное на общее количество элементов все оценки, но слишком много фильтров - в вашем случае, по-видимому, являются только даты, должны быть одинаковыми на источник и суммы элементов по классификации.
То есть: 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, чтобы продемонстрировать, эта логика работает
Я Надеюсь, что помог.
Вы находитесь расчет общего 'SELECT count(*) as total from questionario" всегда с всех записей из таблицы на шаг, который вычисляет проценты, фильтрация дат с 'between'. Так что он правильный, вы должны рассчитать сумму, исходя из тех же условиях.