select
concat(round((sum(gender='M')/count(gender)) * 100, 100), '%') as per_num
from
patients
Вопрос состоит в том, чтобы найти процент пациентов пола М и округлить его до сотых со знаком процента.
Показанный здесь синтаксис отображает ответ как 0%
.
Какую систему баз данных вы используете? sum(gender='M')
во многих случаях будет недопустимым синтаксисом. И даже если это правильный синтаксис, вы суммируете логическое значение?
База данных SQL и sum(gender='M') работают, не выдают никаких ошибок, но часть вычислений не работает. Да, это логический столбец.
Проблема с вашим запросом заключается в том, как вы выполняете операцию округления и обрабатываете деление.
Ниже приведено решение
SELECT
CONCAT(
ROUND(
(SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) / COUNT(*)) * 100,
2
),
'%'
) AS per_num
FROM
patients;
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END)
: подсчитывается количество пациентов с полом «М».
(SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) / COUNT(*)) * 100
: рассчитывается процент пациентов с полом «М».
ROUND(..., 2)
: Результат округляется до сотых.
CONCAT(..., '%')
: добавляет к результату знак процента.
Этот запрос должен дать вам нужный процент в правильном формате.
Вам необходимо привести числитель или знаменатель к типу с плавающей запятой, что можно сделать либо путем явного приведения, либо умножив на 1,0, как показано ниже. Чтобы получить округленное значение, приведите его к числовому типу перед операцией конкатенации.
SELECT concat(
CONVERT(NUMERIC(10,2), (sum(CASE WHEN gender='M' THEN 1 ELSE 0 END)*1.0/count(gender))*100),'%') as per_num
FROM patients;
Похоже, ты хочешь
sum(gender='M') * 100 / count(gender)