2009-12-01 12 views
5

danej tabeli, która dla następujących poleceń:Obliczanie odsetek wewnątrz grupy

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

daje:

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

oraz:

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

Mam trudność pisanie zapytanie, które obliczy procent zatrudnionych w każdej grupie płci. Więc wyjście powinno wyglądać następująco:

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

Możliwy duplikat [Obliczanie procentów za pomocą zapytania GROUP BY] (http://stackoverflow.com/questions/6207224/calculcating-percentages-with-group-by-query) – Vadzim

Odpowiedz

6

Można to zrobić z sub-select i przyłączyć:

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; 

Nie mogę myśleć o innych podejściach od szczytu głowy.

+0

Dzięki za kilka drobnych modyfikacji rozwiązanie zadziałało! – Jon

+0

Nie ma za co. – outis

8

może być za późno, ale na nadchodzące wyszukiwarki, możliwym rozwiązaniem mogłoby być:

Przez IO Statystyka ta wydaje się być najbardziej skuteczne rozwiązanie - może być uzależniona od liczby wierszy być sprawdzony - przetestowany na numery powyżej ...

takim samym nastawieniem mogą być wykorzystane do uzyskania męski/żeński wygranych:

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

Pozdrowienia, Jan