2009-12-01 9 views
5

une table pour les commandes suivantes:pourcentage Le calcul au sein d'un groupe donné

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

donne:

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

et:

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

Je vais avoir une difficulté à écrire un requête qui va calculer le pourcentage d'employés dans chaque groupe de sexe. Ainsi, la sortie devrait ressembler à ceci:

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

Copie possible de [Calculer des pourcentages avec une requête GROUP BY] (http://stackoverflow.com/questions/6207224/calculcating-percentages-with-group-by-query) – Vadzim

Répondre

6

Vous pouvez le faire avec un sous-select et une jointure:

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; 

Je ne peux pas penser à d'autres approches du haut de ma tête.

+0

Merci beaucoup, après quelques modifications mineures solution travaillée! – Jon

+0

De rien. – outis

8

peut être trop tard, mais pour venir chercheurs, solution possible pourrait être:

par IO Statistiques cela semble être la solution la plus efficace - peut dépendre du nombre de lignes à interroger - testé sur les numéros ci-dessus ...

La même attitude pourrait être utilisé pour obtenir le pourcentage mâle/femelle:

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

Cordialement, Jan

Questions connexes