Расчет% от значения символа - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь подсчитать, какая доля моих данных - мужчины, а какая - женщины.

У меня есть следующий код:

select 
  SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) / COUNT(Gender) as perc_male,
  SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) / COUNT (Gender) as perc_female
From [my_table]

Однако при выполнении этого я получаю 0%.Кто-нибудь может увидеть, что я могу делать здесь не так?

Спасибо

Ответы [ 4 ]

0 голосов
/ 08 июля 2019

Проблема в целочисленном делении. Я думаю, что самый простой способ - это использовать AVG():

SELECT AVG(CASE WHEN Gender = 'M' THEN 1.0 ELSE 0 END) as perc_male,
       AVG(CASE WHEN Gender = 'F' THEN 1.0 ELSE 0 END) as perc_female
FROM [my_table]
0 голосов
/ 08 июля 2019

Просто используйте:

select 
SUM(CASE WHEN Gender = 'M' THEN 1.0 ELSE 0.0 END) / COUNT(Gender)
as perc_male,
SUM(CASE WHEN Gender = 'F' THEN 1.0 ELSE 0.0 END) / COUNT (Gender) 
as perc_female
From [my_table]

Вы используете целые числа. При работе с целыми числами SQL всегда пытается вернуть целые числа, как это имеет место в данном случае - не округляет до 0.

0 голосов
/ 08 июля 2019

Используйте явное приведение одного из значений, чтобы получить желаемую точность, например

select 
  SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) / cast(COUNT(Gender) as decimal(5,3)) as perc_male,
  SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) / cast(COUNT(Gender) as decimal(5,3)) as perc_female
From [my_table]
0 голосов
/ 08 июля 2019

Я думаю, что значение меньше 1, поэтому вы получаете 0, попробуйте, как показано ниже

select 
SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) / COUNT(Gender)*1.00
 as perc_male,
SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) / COUNT (Gender)*1.00 
as perc_female
From [my_table]

или используйте явное приведение типа данных с плавающей точкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...