2009-12-01 21 views
5

dada una tabla que para los siguientes comandos:Cálculo de porcentaje dentro de un grupo

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

da:

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

y:

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

estoy teniendo una dificultad para escribir una consulta que calculará el porcentaje de empleados dentro de cada grupo de sexo. Por lo que la salida debería tener este aspecto:

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

Posible duplicado de [Cálculo de porcentajes con la consulta GROUP BY] (http://stackoverflow.com/questions/6207224/calculcating-percentages-with-group-by-query) – Vadzim

Respuesta

6

Usted puede hacerlo con un sub-select y una combinación:

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; 

No puedo pensar en otros enfoques de la parte superior de la cabeza.

+0

Muchas gracias, después de algunas modificaciones menores su solución funcionó! – Jon

+0

De nada. – outis

8

puede ser demasiado tarde, pero para las próximas buscadores, posible solución podría ser:

por las estadísticas IO esta parece ser la solución más eficaz - puede depender del número de líneas que se va a consultar - probado en por encima de los números ...

La misma actitud se podrían utilizar para conseguir macho/hembra porcentaje:

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

Saludos, Jan

Cuestiones relacionadas