2012-05-07 11 views
5

Ho un set di dati che posso raggruppare e voglio conoscere la percentuale di righe in ciascun gruppo.Calcoli con COUNT()

Questo sembra funziona quasi, con la differenza che restituisce 0 per ogni gruppo a causa della mancanza imho typecast

SELECT COUNT(*)/(SELECT COUNT(name) 
        FROM x 
        WHERE d = '0') 
    FROM x, y 
    WHERE x.a = y.a AND x.b = '0' 
    GROUP BY y.c 
    ORDER BY y.c ASC 

Come faccio correttamente lanci questa?

risposta

3

Piuttosto che moltiplicando per 1.0, si può solo lanciare. Mi sembra più pulito e chiaro. Per prima cosa, rende chiaro quale tipo di dati si desidera utilizzare. Potresti essere abbastanza soddisfatto della precisione delle approssimazioni float4 o float8, piuttosto che pagare il costo aggiuntivo per i calcoli esatti numeric.

SELECT COUNT(*)::float/(SELECT COUNT(name) 
          FROM x 
          WHERE d = '0')::float 
    FROM x, y 
    WHERE x.a = y.a AND x.b = '0' 
    GROUP BY y.c 
    ORDER BY y.c ASC 
 
test=# select 1.0 * 5/10; 
     ?column?   
------------------------ 
0.50000000000000000000 
(1 row) 

test=# select pg_typeof(1.0 * 5/10); 
pg_typeof 
----------- 
numeric 
(1 row) 

test=# select 5::float/10::float; 
?column? 
---------- 
     0.5 
(1 row) 

test=# select pg_typeof(5::float/10::float); 
    pg_typeof  
------------------ 
double precision 
(1 row) 
3

Si dovrebbe essere in grado di fare

select 1.0 * count(*)/..... 
+0

Wow ... Mi piace questo :) A volte le soluzioni più semplici sfuggono uno ... –

1

Se si converte al float il problema potrebbe essere risolto:

SELECT convert(double, COUNT(*))/(SELECT convert(double, COUNT(name)) 
        FROM x 
        WHERE d = '0') 
    FROM x, y 
    WHERE x.a = y.a AND x.b = '0' 
    GROUP BY y.c 
    ORDER BY y.c ASC 
+0

ERRORE: colonna "float" non esiste LINEA 1: selezionare Converti (float, COUNT (*))/(SELECT convert (float, COU ... –

+0

Provalo con double allora. –