2012-05-07 42 views
5

Tôi có một tập dữ liệu tôi có thể nhóm và muốn biết tỷ lệ phần trăm của các hàng trong mỗi nhóm.Tính toán với COUNT()

Điều này có vẻ gần như hoạt động, ngoại trừ việc nó trả về 0 cho mỗi nhóm vì IMHO thiếu thợ đúc chư

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 

Làm thế nào để đúc chính xác này?

Trả lời

3

Thay vì nhân với 1.0, bạn có thể chỉ bầu. Điều đó có vẻ sạch hơn và rõ ràng hơn với tôi. Đối với một điều, nó làm rõ loại dữ liệu bạn muốn sử dụng. Bạn có thể đủ hạnh phúc với độ chính xác của các ước tính float4 hoặc float8, thay vì phải trả thêm chi phí cho các phép tính numeric chính xác.

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

Bạn sẽ có thể làm

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

Wow ... Tôi thích cái này :) Đôi khi các giải pháp đơn giản nhất trốn tránh một ... –

1

Nếu bạn chuyển sang float vấn đề của bạn có thể được giải quyết:

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

ERROR: Cột "phao" không tồn tại Dòng 1: chọn Convert (float, COUNT (*))/(SELECT chuyển đổi (float, COU ... –

+0

Hãy thử nó với đôi sau đó. –