2012-05-07 52 views
5

我有一个数据集可以分组,并且想知道每个组中的行的百分比。使用COUNT计算()

这似乎近的作品,除了它,因为恕我直言,缺少强制转换

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 

的每一组返回0,我该如何正确地投呢?

回答

3

不是通过1.0相乘,你可以只投。这对我来说似乎更清晰和清晰。首先,它明确了您要使用的数据类型。您可能会对float4float8近似值的精度感到满意,而不是为确切的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

你应该能够做到

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

哇......我喜欢这一个:) 有时,最简单的解决方案躲避一个... –

1

如果您转换为float您的问题可能会得到解决:

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

错误:列 “浮动” 不存在 LINE 1:选择转换(浮动,COUNT( *))/(选择转换(浮点数,COU ... –

+0

尝试与双然后。 –

相关问题