2009-12-01 4 views
5

данной таблицы, что для следующих команд:Расчет процент в группе

select sex, count(*) from my_table group by sex; 
select sex, employed, count(*) from my_table group by sex, employed; 

дает:

sex | count 
-------+------ 
male | 1960 
female | 1801 

и:

sex  | employed | count 
---------+----------+------- 
male | f  | 1523 
male | t  | 437 
female | f  | 1491 
female | t  | 310 

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

sex  | employed | count | percent 
---------+----------+--------+----------- 
male | f  | 1523 | 77.7% (1523/1960) 
male | t  | 437 | 22.3% (437/1960) 
female | f  | 1491 | 82.8% (1491/1801) 
female | t  | 310 | 17.2% (310/1801) 
+0

Возможный дубликат [Вычисление процентов с запросом GROUP BY] (http://stackoverflow.com/questions/6207224/calculcating-percentages-with-group-by-query) – Vadzim

ответ

6

Вы можете сделать это с суб-выбора и присоединиться:

SELECT t1.sex, employed, count(*) AS `count`, count(*)/t2.total AS percent 
    FROM my_table AS t1 
    JOIN (
    SELECT sex, count(*) AS total 
     FROM my_table 
     GROUP BY sex 
) AS t2 
    ON t1.sex = t2.sex 
    GROUP BY t1.sex, employed; 

Я не могу думать о других подходах с верхней части моей головы.

+0

Благодарим вас за небольшую модификацию решение работало! – Jon

+0

Добро пожаловать. – outis

8

Может быть, слишком поздно, но для предстоящих искателей, возможно решение может быть:

Ио статистики это, как представляется, наиболее эффективным решением - может зависеть от количества строк запрашиваться - протестирован на числа над ...

Такое же отношение может быть использовано для получения мужской/женский процент:

select sex, COUNT(*)/CAST(SUM(count(*)) over() as float) 
    from my_table 
group by sex 

С уважением, Jan

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