2012-05-07 30 views
5

Mam zestaw danych, który mogę grupować i chcę poznać procent wierszy w każdej grupie.Obliczenia za pomocą COUNT()

To wydaje się prawie działa, poza tym, że zwraca 0 dla każdej grupy z powodu imho brakującego 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 

Jak prawidłowo oddanych tym?

Odpowiedz

3

Zamiast pomnożenie przez 1.0, można po prostu rzucić. Wydaje mi się to czystsze i jaśniejsze. Po pierwsze, wyjaśnia, jakiego typu danych chcesz użyć. Możesz być wystarczająco szczęśliwy z precyzją przybliżenia float4 lub float8, zamiast płacić dodatkowy koszt za dokładne obliczenia 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

Powinieneś być w stanie zrobić

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

Wow ... Lubię ten jeden :) Czasami najprostsze rozwiązania wymykają jeden ... –

1

Jeśli konwersja do float Twój problem może być rozwiązany:

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

BŁĄD: kolumna "pływak" nie istnieje LINE 1: SELECT konwersji (float, COUNT (*))/(SELECT convert (float, COU ... –

+0

Wypróbuj dwukrotnie. –

Powiązane problemy